我有个新手问题我正试图用函数中的模式匹配来解析XML消息消息示例如下:
<msg> <action type="xxx"... /> </msg>
我想做的是(有点)
decode_msg_in( << $<,$m,$s,$g,$>, Message/binary, $<,$/,$m,$s,$g,$> >>, R ) ->
解码不工作(显然,这只是我想做的一个指示)。这可能吗有人有主意吗?或者我需要将整个消息作为一个列表进行“迭代”,构建新的“单词”?
5t7ly7z51#
我可能认为你需要阅读关于位语法表达式,二进制理解和关于这个名为erlsom的xml解析器库,下载它here。你会被带进你想做的事情的速度。
编辑
xml消息可以作为二进制文件或字符串到达您的服务器:无论采用哪种方式,所提供的xml解析器都可以将xml数据解析为Erlang术语。使用erlsom库,这里是一个xml结构的例子。我在代码路径中有我的erlsom库。
erlsom
C:\Windows\System32>erl Eshell V5.9 (abort with ^G) 1> XML = "<msg><action type=\"xxx\"/>message</msg>". "<msg><action type=\"xxx\"/>message</msg>" 2> erlsom:simple_form(XML). {ok,{"msg",[],[{"action",[{"type","xxx"}],[]},"message"]}, []} 3> {_,Parsed,_} = erlsom:simple_form(XML). {ok,{"msg",[],[{"action",[{"type","xxx"}],[]},"message"]}, []} 4> Parsed. {"msg",[],[{"action",[{"type","xxx"}],[]},"message"]} 5> {_,_,[{_,[{_,ActionType}],_},Message]} = Parsed. {"msg",[],[{"action",[{"type","xxx"}],[]},"message"]} 6> ActionType. "xxx" 7> Message. "message" 8>
从上面可以看到,它可以归结为简单的模式匹配。结果结构将给予你一些干净的东西,只要你发送正确格式化xml data。如果您怀疑有不正确的xml数据访问了您的服务器,那么,您需要将解析器 Package 在try [CALL] of [GoodResult] -> [Action1] catch _Error:_Reason -> [Action2] end.请注意,如果XML Body非常大,则需要使用SAX method来解析XML,以避免占用大量内存。库文档中包含了SAX示例。
xml data
try [CALL] of [GoodResult] -> [Action1] catch _Error:_Reason -> [Action2] end.
SAX method
1条答案
按热度按时间5t7ly7z51#
我可能认为你需要阅读关于位语法表达式,二进制理解和关于这个名为erlsom的xml解析器库,下载它here。你会被带进你想做的事情的速度。
编辑
xml消息可以作为二进制文件或字符串到达您的服务器:无论采用哪种方式,所提供的xml解析器都可以将xml数据解析为Erlang术语。使用
erlsom
库,这里是一个xml结构的例子。我在代码路径中有我的erlsom
库。从上面可以看到,它可以归结为简单的模式匹配。结果结构将给予你一些干净的东西,只要你发送正确格式化
xml data
。如果您怀疑有不正确的xml数据访问了您的服务器,那么,您需要将解析器 Package 在try [CALL] of [GoodResult] -> [Action1] catch _Error:_Reason -> [Action2] end.
请注意,如果XML Body非常大,则需要使用
SAX method
来解析XML,以避免占用大量内存。库文档中包含了SAX示例。