【问题标题】:Mongooseim match sub element valueMongooseim 匹配子元素值
【发布时间】:2015-04-15 16:46:51
【问题描述】:

我在 xmpp 数据包的消息元素中有一个名为 Request 的子元素。因此,我的数据包如下所示:

<message to="b" from="a" type="chat"> 
    <request xmlns="urn:client:send-ack"></request> 
</message>

我想匹配请求元素中 xmlns 属性的值。所以我想做类似的事情

case xml:get_attr_s(<<"xmlns">>, xml_get_subtag(<<Request>>,Packet)) of
   "urn:client:send-receipts" ->
   %% Do something
   ok.

但是,显然这是最密集的工作。最好的方法是什么?

【问题讨论】:

  • 如果你真的想使用xml 模块,那么xml:get_tag_attr(&lt;&lt;"xmlns"&gt;&gt;, xml:get_subtag(El, &lt;&lt;"request"&gt;&gt;)) 是要走的路,但是(可以说)exml_query:path/2,Piotr 建议的,有一个更方便的界面。跨度>

标签: erlang ejabberd mongoose-im


【解决方案1】:

获取此属性的简单快捷方法是exml_query:path/2。有了它,您的case ... of 将跟随:

case exml_query:path(Stanza, [{element, <<"request">>}, {attr, <<"xmlns">>}]) of
    <<"urn:client:send-receipts">> -> something;
    _ -> something_else
end

【讨论】:

  • 嘿,谢谢它的工作。但我有一个小问题。我的数据包中有两个请求标签。我要找的是第二个。但是,每当我使用 exml_query:path 查找匹配项时,它都会返回第一个匹配项。有没有办法遍历数据包或检查下一个匹配或其他什么?
  • 在这种情况下,使用具有相同参数的exml_query:paths/2,它将返回结果列表,在这种情况下,两个元素的xmlns 值列表。然后您可以使用lists:member/2 来检查所需的 XMLNS 是否存在。
【解决方案2】:

使用最新的 ejabberd 开发版本,您可以使用以下内容做您想做的事情:

xml:get_subtags_with_xmlns(Parsed_xml, <<"request">>, <<"urn:client:send-ack">>).

它将匹配任意数量的子标签并返回一个列表。

您需要从源代码构建 ejabberd 或使用即将在月底之前发布的 ejabberd 15.04 版本。

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多