2013-05-25 32 views
5

Trước đây tôi đã sử dụng xml: get_tag_attr_s ("loại", Gói) cho dòng gỡ lỗi đó trong ejabberd 2.1.10, nhưng điều đó không hoạt động nữa trong ejabberd 13.03. Có lẽ bởi vì nó không được chấp nhận theo các tài liệu (http://www.process-one.net/docs/exmpp/devdoc/trunk/xml.html#get_attr_s-2), vì vậy tôi đã thử sử dụng một hàm từ thư viện exmpp.Lỗi điều khoản chức năng khi sử dụng chức năng exmpp

Tôi gặp lỗi trên dòng DEBUG thứ hai (Dòng gỡ lỗi đầu tiên hoạt động tốt). Và ý tưởng làm thế nào để có được giá trị từ thuộc tính?

Mã đoạn trích:

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]), 

Log:

=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}]}]} 

Trả lời

6

Các Packet rằng bạn đang đi qua để exmpp_xml:get_attribute là một kỷ lục xmlel với ba lĩnh vực: tên phần tử, thuộc tính và phần tử con. Tuy nhiên, exmpp xác định kỷ lục xmlel với năm yếu tố (definition from here):

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

tôi đã có một cái nhìn nhanh chóng vào mã nguồn ejabberd 13,03, và có vẻ như xml:get_tag_attr_s nên hoạt động tốt, vì vậy tôi nghi ngờ rằng ejabberd 13,03 không phải là tương thích với exmpp. (Mặc dù tôi đã không theo dõi phát triển ejabberd gần đây, do đó, cái nhìn sâu sắc hơn về điều đó sẽ được đánh giá cao.) Tôi nghĩ bạn nên cố gắng hết sức để tìm ra lý do tại sao get_tag_attr_s phá vỡ cho bạn.

+1

Bạn nói đúng. xml: get_tag_attr_s ("type", Packet) bây giờ sẽ là xml: get_tag_attr_s (<<"type">>, Packet) để làm việc cho ejabberd 13.XX –

0

Pre ejabberd 13.XX

xml:get_tag_attr_s("type", Packet) 

bài ejabberd 13.XX

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

On ejabberd 16,04 nó phải được

fxml: get_tag_attr_s (< < " nhập ">>, gói)

Các vấn đề liên quan