我正在使用filter_packet挂钩捕获数据包。现在我该如何解析这个xmlel并获得所需标签的值?
答案 0 :(得分:2)
实际上当您在ejabberd或mongooseim中使用钩子时,您将获得已解析的消息。你可以检索身体'使用xml或exml库从该解析结构中获取子元素。例如:
exml_query:subelement(YourMessage, <<"body">>),
或
xml:get_subtag(Message, <<"body">>),
或者您可以手动迭代所有子元素并使用它们执行某些操作
#xmlel{name= <<"message">>, children= Els} = Message,
[ do_something(Body) || #xmlel{name = <<"body">>} = Body <- Els ]
检索body元素时,可以提取其值
xml:get_tag_cdata(Body)
或
exml_query:cdata(Body)
作为一种选择,如果您确定该消息包含正文,则可以立即提取正文值
exml_query:path(Message, [{element, <<"body">>},cdata])
答案 1 :(得分:1)
我几乎可以肯定必须已经解析了xmlel
对象,这很容易解构。无论如何,如果你设法从ejabberd获得的唯一的东西只是原始节,你可以使用xmerl
来完成这项工作。它已记录在案,并以user's guide开头。
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>