【问题标题】:Parse packet xmel in Ejabberd 13.12在 Ejabberd 13.12 中解析数据包 xmel
【发布时间】:2014-12-25 23:45:12
【问题描述】:

我正在使用 filter_packet 挂钩捕获数据包。现在如何解析这个 xmlel 并获取所需标签的值?

【问题讨论】:

  • 你能举出任何例子来说明你得到了什么并描述你有什么困难吗?
  • @Dimitry Belyaev <<"<message xmlns=\"jabber:client\" to=\"test1@kushdev.ssqueal.org/20500423901404388005197218/Gajim\" type=\"chat\" id=\"66\"><body>as</body><x xmlns=\"jabber:x:event\"><composing /></x><thread>eJFMuziLDXZIdeWRvUCdjPfyIZJoucVE</thread></message>">> 例如,如何获取 标签的值?

标签: xml erlang ejabberd


【解决方案1】:

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

 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])

【讨论】:

    【解决方案2】:

    我几乎可以肯定必须已经解析了 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> 
    

    【讨论】:

    • 新的 ejabberd 和 mongooseim 使用 exml 库,而不是 xmerl
    • 他们从来没有这样做过。这并不意味着必须以相同的方式完成。
    • 同理,可以使用XPath。
    猜你喜欢
    • 1970-01-01
    • 2019-04-10
    • 2015-12-17
    • 1970-01-01
    • 2020-06-27
    • 2016-04-08
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多