1

私はこのパケットを持っています:

{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")
4

2 に答える 2

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">>}], []}]}]}.

その後、次のことができます。

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">>
于 2016-03-30T07:02:32.100 に答える
1

私はこれをテストしました。これは非常に基本的なものですが、うまく機能していますが、かなり非効率的であり、これを行うためのより良い方法があるかもしれません (騎兵隊が到着するのを待ちます):

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 パケットで変更されないアトムなど、いくつかの制約を確立します。理解していただければ幸いです。

于 2016-03-30T00:40:27.903 に答える