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

Mr.*_*ero 1 erlang ejabberd erl

我有这个包:

{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"}], []}]}]}
Run Code Online (Sandbox Code Playgroud)

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

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

我试过的例子:

xml:get_subtag(Packet, "maxchars")
Run Code Online (Sandbox Code Playgroud)

Mic*_*ond 5

使用最新版本的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">>}], []}]}]}.
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

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).  
Run Code Online (Sandbox Code Playgroud)

MS和MC包含您的值:

MS = <<"20">>
MC = <<"32768">>
Run Code Online (Sandbox Code Playgroud)