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>
线上,我们模式匹配您期望在该“格式”中的值。将 绑定 放置在您想要从中获取值的位置,如果可能的话,建立一些约束,例如,在 XML 数据包中不会改变的原子。我希望你能明白。
【讨论】:
是的。我明白了,谢谢,但我认为 xml.erl 中有一个函数可以捕获这样的数据。我认为它比这更好。以上是关于ejabberd:如何从 xml 元素中提取数据的主要内容,如果未能解决你的问题,请参考以下文章
Ejabberd 13.12 如何添加元素 XMPP 数据包?