我可以使用模式匹配来解析Erlang中的XML吗?

t3irkdon  于 2023-09-28  发布在  Erlang
关注(0)|答案(1)|浏览(153)

我有个新手问题
我正试图用函数中的模式匹配来解析XML消息
消息示例如下:

<msg> <action type="xxx"... />  </msg>

我想做的是(有点)

decode_msg_in( << $<,$m,$s,$g,$>, Message/binary, $<,$/,$m,$s,$g,$> >>, R ) ->

解码不工作(显然,这只是我想做的一个指示)。
这可能吗
有人有主意吗?或者我需要将整个消息作为一个列表进行“迭代”,构建新的“单词”?

5t7ly7z5

5t7ly7z51#

我可能认为你需要阅读关于位语法表达式,二进制理解和关于这个名为erlsom的xml解析器库,下载它here。你会被带进你想做的事情的速度。

编辑

xml消息可以作为二进制文件或字符串到达您的服务器:无论采用哪种方式,所提供的xml解析器都可以将xml数据解析为Erlang术语。使用erlsom库,这里是一个xml结构的例子。我在代码路径中有我的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示例。

相关问题