2016-03-29 2 views
1

У меня есть этот пакет:ejabberd: Как извлечь данные из XML-элемента

{xmlelement,"presence", [{"xml:lang","en"}, {"ver","6.00.00"}, {"to", "[email protected]/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" & & "узел")

То, что я делать - это использовать функции, расположенные в xml.erl, но я не знаю, как это сделать.

Пример того, что я пробовал:

xml:get_subtag(Packet, "maxchars") 
+0

Вы, кажется, с помощью очень старая версия ejabberd. В новой версии используются записи #xmlel. –

ответ

5

С недавней версией ejabberd (=, которая меньше 3 лет), вы можете сделать следующее.

Я предполагаю, что пакет является бинарной xmlel запись:

P = {xmlel,<<"presence">>, [{<<"xml:lang">>,<<"en">>}, {<<"ver">>,<<"6.00.00">>}, {<<"to">>, <<"[email protected]/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">> 
+0

Я использую ejabberd 2.1.13. Могу ли я сделать это с помощью функций в xml.erl? cuz там нет функции named: get_subtag_with_xmlns в старой версии –

+0

Я пытаюсь добавить функцию (get_subtag_with_xmlns) в xml.erl, что я здесь делаю: http://paste.ubuntu.com/15558018/ is это правда ? –

+0

просто используйте get_subtag и игнорируйте пространство имен. Примечание. Вы действительно не должны использовать выпуск версии в июне 2013 года. Вам не хватает исправлений безопасности. –

1

Я испытал это, это довольно простой, но он работает нормально, хотя я уверен, что это очень неэффективно и/или там могут быть более эффективные способы для осуществления этого (ждать кавалерию, чтобы прибыть):

1> X = {xmlelement,"presence", [{"xml:lang","en"}, {"ver","6.00.00"}, {"to", "[email protected]/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","[email protected]/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","[email protected]/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. Надеюсь, вы поняли эту идею.

+0

есть. Я получаю благодарность, но я думаю, что есть функция в xml.erl, созданная для сбора данных, подобных этому. Я думаю, что это лучше, чем это. –

Смежные вопросы