2013-05-25 3 views
5

Раньше я использовал xml: get_tag_attr_s («type», Packet) для этой строки отладки в ejabberd 2.1.10, но это больше не работает в ejabberd 13.03. Вероятно, потому что он устарел в соответствии с документами (http://www.process-one.net/docs/exmpp/devdoc/trunk/xml.html#get_attr_s-2), поэтому я попытался использовать функцию из библиотеки exmpp.Ошибка предложения функции при использовании функции exmpp

Я получаю сообщение об ошибке на второй строке DEBUG (первая строка отладки работает нормально). И идеи, как получить значение из атрибута?

фрагмент кода:

on_user_send_packet(From, To, Packet) -> 
    ?DEBUG("Sent packet (1): ~p", [Packet]), 
    Type = exmpp_xml:get_attribute(Packet, <<"type">>, <<"unknown">>), 
    ?DEBUG("Sent packet from (2): ~p", [From]), 

Вход:

=INFO REPORT==== 2013-05-25 09:58:50 === 
    D(<0.1625.0>:mod_stanza_ack:59) : Sent packet (1): {xmlel,<<"message">>, 
               [{<<"to">>, 
                <<"[email protected]_dev">>}, 
               {<<"from">>, 
                <<"[email protected]_dev/webapp">>}, 
               {<<"type">>,<<"chat">>}, 
               {<<"id">>,<<"4834">>}], 
               [{xmlel,<<"body">>,[], 
                [{xmlcdata, 
                <<"SHOOOOOT">>}]}, 
               {xmlel,<<"request">>, 
                [{<<"xmlns">>, 
                <<"urn:xmpp:receipts">>}], 
                []}]} 

=ERROR REPORT==== 2013-05-25 09:58:50 === 
E(<0.1625.0>:ejabberd_hooks:315) : {function_clause, 
           [{exmpp_xml,get_attribute, 
            [{xmlel,<<"message">>, 
            [{<<"to">>, 
             <<"[email protected]_dev">>}, 
            {<<"from">>, 
             <<"[email protected]_dev/webapp">>}, 
            {<<"type">>,<<"chat">>}, 
            {<<"id">>,<<"4834">>}], 
            [{xmlel,<<"body">>,[], 
             [{xmlcdata,<<"SHOOOOOT">>}]}, 
            {xmlel,<<"request">>, 
             [{<<"xmlns">>, 
             <<"urn:xmpp:receipts">>}], 
             []}]}, 
            <<"from">>,<<"unknown">>], 
            [{file,"./core/exmpp_xml.erl"}, 
            {line,1173}]}, 
           {mod_stanza_ack,on_user_send_packet,3, 
            [{file,"mod_stanza_ack.erl"},{line,60}]}, 
           {ejabberd_hooks,run1,3, 
            [{file,"ejabberd_hooks.erl"}, 
            {line,311}]}, 
           {ejabberd_c2s,session_established2,2, 
            [{file,"ejabberd_c2s.erl"},{line,1136}]}, 
           {p1_fsm,handle_msg,10, 
            [{file,"p1_fsm.erl"},{line,578}]}, 
           {proc_lib,init_p_do_apply,3, 
            [{file,"proc_lib.erl"},{line,239}]}]} 

ответ

6

Packet, что вы передаете в exmpp_xml:get_attribute является xmlel запись с тремя полями: имя элемента, атрибуты и дочерние элементы. Тем не менее, exmpp определяет xmlel запись с пятью элементами (definition from here):

% Elements. 
-record(xmlel, { 
    ns = undefined :: xmlname() | undefined, 
    declared_ns = [] :: [{xmlname(), string() | none}], 
    name :: xmlname(), 
    attrs = [] :: [xmlattr()], 
    children = [] :: [#xmlel{} | xmlcdata()] | undefined 
}). 

У меня был быстрый взгляд на исходный код ejabberd 13.03, и это выглядит как xml:get_tag_attr_s должно работать нормально, так что я подозреваю, что ejabberd 13,03 не совместим с exmpp. (Хотя я не следил за развитием ejabberd в последнее время, поэтому более глубокое понимание об этом было бы оценено.) Я думаю, вам лучше разобраться, почему get_tag_attr_s ломается для вас.

+1

Вы правы. xml: get_tag_attr_s («type», Packet) теперь должен быть xml: get_tag_attr_s (<<"type">>, Packet), чтобы работать на ejabberd 13.XX –

0

Pre ejabberd 13.XX

xml:get_tag_attr_s("type", Packet) 

Сообщение ejabberd 13.XX

xml:get_tag_attr_s(<<"type">>, Packet) 
0

На ejabberd 16.04 он должен быть

FXML: get_tag_attr_s (< < " type ">>, Packet)