ejabberd:如何从 xml 元素中提取数据

Posted

技术标签:

【中文标题】ejabberd:如何从 xml 元素中提取数据【英文标题】:ejabberd : How to extract data from xml element 【发布时间】:2016-07-17 16:38:08 【问题描述】:

我有这个包:

xmlelement,"presence", ["xml:lang","en", "ver","6.00.00", "to", "test@conference.localhost/user"],
                        [xmlelement,"c", ["xmlns", "http://jabber.org/protocol/caps", "node", "http://www.google.com/xmpp/client/caps/", "ver", "eVvrsq8jya/4AZMjFl5BeDKSmg4=", "hash","sha-1"], [],
                        xmlelement,"nick", ["xmlns", "http://jabber.org/protocol/nick"], [xmlcdata,<<"user">>],
                        xmlelement,"x", ["xmlns", "http://jabber.org/protocol/muc"], [xmlelement,"history", ["maxstanzas","20", "maxchars","32768"], []]]

我想从:("maxchars" && "node") 中提取数据

我正在做的是使用位于 xml.erl 中的函数,但我不知道该怎么做。

我尝试过的示例:

xml:get_subtag(Packet, "maxchars")

【问题讨论】:

您似乎在使用非常旧的 ejabberd 版本。新版本使用#xmlel 记录。 【参考方案1】:

使用最新版本的 ejabberd(= 不到 3 年),您可以执行以下操作。

我假设数据包是二进制 xmlel 记录:

P = xmlel,<<"presence">>, [<<"xml:lang">>,<<"en">>, <<"ver">>,<<"6.00.00">>, <<"to">>, <<"test@conference.localhost/user">>],
     [xmlel,<<"c">>, [<<"xmlns">>, <<"http://jabber.org/protocol/caps">>, <<"node">>, <<"http://www.google.com/xmpp/client/caps/">>, <<"ver">>, <<"eVvrsq8jya/4AZMjFl5BeDKSmg4=">>, <<"hash">>,<<"sha-1">>], [],
      xmlel,<<"nick">>, [<<"xmlns">>, <<"http://jabber.org/protocol/nick">>], [xmlcdata,<<"user">>],
      xmlel,<<"x">>, [<<"xmlns">>, <<"http://jabber.org/protocol/muc">>], [xmlel,<<"history">>, [<<"maxstanzas">>,<<"20">>, <<"maxchars">>,<<"32768">>], []]].

你可以这样做:

X = fxml:get_subtag_with_xmlns(P, <<"x">>, <<"http://jabber.org/protocol/muc">>).                                                                                        
H = fxml:get_subtag(X, <<"history">>).
value, MS = fxml:get_tag_attr(<<"maxstanzas">>, H).
value, MC = fxml:get_tag_attr(<<"maxchars">>, H).  

MS 和 MC 包含您的价值观:

MS = <<"20">>
MC = <<"32768">>

【讨论】:

我正在使用 ejabberd 2.1.13 。我可以使用 xml.erl 中的功能吗?因为旧版本中没有名为:get_subtag_with_xmlns 的函数 我正在尝试将 (get_subtag_with_xmlns) 函数添加到 xml.erl 我在这里做什么:paste.ubuntu.com/15558018 是真的吗? 然后只使用 get_subtag 并忽略命名空间。注意:您真的不应该使用 2013 年 6 月发布的版本。您缺少很多安全修复程序。 我在 2 年前使用这个版本,我在 muc-room 中添加了一些有用的功能......等等,我发现它非常好,我认为所有 ejabberd 版本都很好:D。所以我不能离开更新版本。 对不起,我是 erlang 的新手。我也认为 ejabberd 会让我一点一点地学习这门语言。【参考方案2】:

我对此进行了测试,它非常基本,但运行良好,虽然我很确定它的效率很低和/或可能有更好的方法来做到这一点(等待骑兵到达):

1> X = xmlelement,"presence", ["xml:lang","en", "ver","6.00.00", "to", "test@conference.localhost/user"], [xmlelement,"c", ["xmlns", "http://jabber.org/protocol/caps", "node", "http://www.google.com/xmpp/client/caps/", "ver", "eVvrsq8jya/4AZMjFl5BeDKSmg4=", "hash","sha-1"], [], xmlelement,"nick", ["xmlns", "http://jabber.org/protocol/nick"], [xmlcdata,<<"user">>], xmlelement,"x", ["xmlns", "http://jabber.org/protocol/muc"], [xmlelement,"history", ["maxstanzas","20", "maxchars","32768"], []]].
xmlelement,"presence",
            ["xml:lang","en",
             "ver","6.00.00",
             "to","test@conference.localhost/user"],
            [xmlelement,"c",
                         ["xmlns","http://jabber.org/protocol/caps",
                          "node","http://www.google.com/xmpp/client/caps/",
                          "ver","eVvrsq8jya/4AZMjFl5BeDKSmg4=",
                          "hash","sha-1"],
                         [],
             xmlelement,"nick",
                         ["xmlns","http://jabber.org/protocol/nick"],
                         [xmlcdata,<<"user">>],
             xmlelement,"x",
                         ["xmlns","http://jabber.org/protocol/muc"],
                         [xmlelement,"history",
                                      ["maxstanzas","20",
                                       "maxchars","32768"],
                                      []]]
2> xmlelement,_,[_,_,_,_,_,_],[xmlelement,_,[_,_,"node",Node,_,_,_,_],[],xmlelement,_,[_,_],[xmlcdata,_],xmlelement,_,[_,_],[xmlelement,_,[_,_,"maxchars",MaxChars],[]]] = X.
xmlelement,"presence",
            ["xml:lang","en",
             "ver","6.00.00",
             "to","test@conference.localhost/user"],
            [xmlelement,"c",
                         ["xmlns","http://jabber.org/protocol/caps",
                          "node","http://www.google.com/xmpp/client/caps/",
                          "ver","eVvrsq8jya/4AZMjFl5BeDKSmg4=",
                          "hash","sha-1"],
                         [],
             xmlelement,"nick",
                         ["xmlns","http://jabber.org/protocol/nick"],
                         [xmlcdata,<<"user">>],
             xmlelement,"x",
                         ["xmlns","http://jabber.org/protocol/muc"],
                         [xmlelement,"history",
                                      ["maxstanzas","20",
                                       "maxchars","32768"],
                                      []]]
3> Node.
"http://www.google.com/xmpp/client/caps/"
4> MaxChars.
"32768"
5>

2&gt; 线上,我们模式匹配您期望在该“格式”中的值。将 绑定 放置在您想要从中获取值的位置,如果可能的话,建立一些约束,例如,在 XML 数据包中不会改变的原子。我希望你能明白。

【讨论】:

是的。我明白了,谢谢,但我认为 xml.erl 中有一个函数可以捕获这样的数据。我认为它比这更好。

以上是关于ejabberd:如何从 xml 元素中提取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据包从服务器发送到客户端(从函数)Ejabberd

Ejabberd 13.12 如何添加元素 XMPP 数据包?

如何使用 python 从 flickr xml 图像数据中提取图像地理数据?

从 SQL 中的 XML 数据中提取属性详细信息

从 xml 的元素中提取命名空间属性

xml,append_subtags 时出现 Ejabberd 错误