Xml 解析Ejabberd 13.12中的数据包xmel

Xml 解析Ejabberd 13.12中的数据包xmel,xml,erlang,ejabberd,Xml,Erlang,Ejabberd,我正在使用filter_数据包挂钩捕获数据包。现在,我如何解析这个xmlel并获得所需标记的值呢?我几乎可以肯定,已经传递了解析的xmlel对象,这非常容易解构。不管怎样,如果你从ejabberd那里得到的唯一东西就是raw节,那么你可以使用xmerl来完成这项工作。它是有文档记录的,必须从开始 1> S = <<"<message ...">>. 2> (fun(Str) -> {Root, []} = xmerl_scan:string(Str

我正在使用filter_数据包挂钩捕获数据包。现在,我如何解析这个xmlel并获得所需标记的值呢?

我几乎可以肯定,已经传递了解析的
xmlel
对象,这非常容易解构。不管怎样,如果你从ejabberd那里得到的唯一东西就是raw节,那么你可以使用
xmerl
来完成这项工作。它是有文档记录的,必须从开始

1> S = <<"<message ...">>.
2> (fun(Str) -> {Root, []} = xmerl_scan:string(Str), [{xmlText, _, _, _, Text, _}] = xmerl_xpath:string("//body/text()", Root), Text end)(binary_to_list(S)).
"as"
3> 
1>S=。
2> (fun(Str)->{Root,[]}=xmerl_scan:string(Str),[{xmlText,u,u,u,Text,}]=xmerl_xpath:string(“//body/Text()”,Root),Text end)(二进制列表)。
“作为”
3> 

实际上,当您在ejabberd或mongooseim中使用钩子时,您将得到已解析的消息。您可以使用xml或exml库从解析的结构中检索“body”子元素。例如:

 exml_query:subelement(YourMessage, <<"body">>),

作为一个选项,若您确定消息包含body,您可以立即提取body的值

exml_query:path(Message, [{element, <<"body">>},cdata])
exml\u查询:路径(消息,[{element,},cdata])

你能举例说明你得到了什么,并描述你有什么困难吗?@Dimitry Belyaev
例如,我如何获得标签的值?新的ejabberd和mongooseim使用
exml
库,而不是Xmerl他们从未使用过。这并不意味着必须以同样的方式完成。同样的方式,您可以使用XPath。
   #xmlel{name= <<"message">>, children= Els} = Message,
   [ do_something(Body) || #xmlel{name = <<"body">>} = Body <- Els ]
xml:get_tag_cdata(Body)
exml_query:cdata(Body)
exml_query:path(Message, [{element, <<"body">>},cdata])