Не удается прочитать пользовательские атрибуты из тега сообщения при использовании библиотеки asmack XMPP для Android?

Это XML, отправленный со стороны сервера XMPP, который я хочу получить, чтобы я мог отправить его в свой анализатор XML.

<message to="[email protected]/smack" chat_id="73392" 
       custom_packet="true" user_id="44" manager_id="39" time_stamp="0" website_id="0" 
       visitor_name="John" end_time="False" xml:lang="en-us" type="groupchat" 
       from="[email protected]/39">
       <body>Hello</body> 
       <x xmlns="http://jabber.org/protocol/muc#user"> 
       <status xmlns="" code="0"/>   
       </x></message>

Это образец XML, который я получаю. Когда я использую p.toXML(); //Пакет p

 <message to="[email protected]/Smack" 
    from="[email protected]/Visitor1171" type="groupchat">
    <body>Hello</body>
    <delay xmlns="urn:xmpp:delay"></delay>
    <x xmlns="jabber:x:delay" stamp="20120917T05:57:19" 
    from="[email protected]/4732abb5">
    </x></message>

Я только что начал использовать сервер XMPP. Поэтому любое руководство будет оценено.


person Sheraz Ahmad Khilji    schedule 17.09.2012    source источник
comment
Никогда не придумывайте собственные атрибуты для элементов верхнего уровня XMPP. См. также XEP-134 2.1. Вместо этого добавьте расширение <myextension xmlns='myns'><chat_id name='24214'/>/</myextension>   -  person Flow    schedule 12.01.2015


Ответы (2)


Вы не можете сделать это в Smack (и, следовательно, в Smack) без изменения исходного кода. Он будет анализировать только стандартную строфу сообщения, поэтому все ваши пользовательские атрибуты будут проигнорированы. Правильный подход в XMPP — создавать расширения для стандартных пакетов, а не изменять их. Если у вас есть контроль над тем, что отправляется с сервера, вам следует изменить свой подход к добавлению пользовательского расширения к сообщению, тем самым изменив этот

<message to="[email protected]/smack" chat_id="73392" 
 custom_packet="true" user_id="44" manager_id="39" time_stamp="0" 
 website_id="0" visitor_name="John" end_time="False" xml:lang="en-us" 
 type="groupchat" from="[email protected]/39">
   <body>Hello</body>
   <x xmlns="http://jabber.org/protocol/muc#user">
      <status xmlns="" code="0"/>
   </x>
</message>

к этому

<message to="[email protected]/smack" chat_id="73392" xml:lang="en-us" 
 type="groupchat" from="[email protected]/39">
   <body>Hello</body>
   <x xmlns="http://jabber.org/protocol/muc#user">
      <status xmlns="" code="0"/>
   </x>
   <custom xmlns="my:namespace:custom" user_id="44" manager_id="39" time_stamp="0" 
 website_id="0" visitor_name="John" end_time="False"/>
</message>

Затем вы можете легко написать свой собственный провайдер для анализа расширения пользовательского пакета и просто получить свой пользовательский объект (созданный вашим синтаксическим анализатором), вызвав

MyExtension customStuff = message.getExtension("my:namespace:custom");

Вы можете проверить EmbeddedExtensionProvider чтобы очень легко написать свой провайдер.

person Robin    schedule 17.09.2012
comment
Робин здесь на высоте. Вы задаете неправильный вопрос. Однако будьте осторожны с URI пространства имен, который вы используете; my: не является зарегистрированным префиксом URI, которым вы управляете. Если вы не собираетесь применять стандарты, URL-адрес http://, которым вы управляете, может использоваться как URI, который гарантированно будет уникальным. - person Joe Hildebrand; 18.09.2012
comment
Спасибо за ответ. Поэтому я должен изменить код на стороне сервера для этого. Я никак не могу извлечь атрибуты из Message Stanza. - person Sheraz Ahmad Khilji; 18.09.2012
comment
Я решил эту проблему, изменив исходный код. Для получения более подробной информации о том, как это сделать, вот ссылка. stackoverflow.com/questions/12475122/ - person Sheraz Ahmad Khilji; 19.09.2012

do {
    ParseEvent event=parser.read();
    ParseEvent pe;

    switch(event.getType()){
        case Xml.START_TAG:
        if (event.getName().toString().equals("message")){
                int xx=event.getAttributeCount();

                String _s2=event.getAttribute("to").getValue();
                if(_s2=="" || _s2==null){
                    _s2="N/A";
                }

                String _s3=event.getAttribute("from").getValue();       
                if(_s3=="" || _s3==null){
                    _s3="N/A";
                }

                String _s4=event.getAttribute("type").getValue();
                if(_s4=="" || _s4==null){
                    _s4="N/A";
                }

                String _s1=_s2+"~~"+_s3+"~~"+_s4;
                m_result.add(new BeanClassName(_s1));                   
        }
        (...)
    }
}

Вы можете прочитать свои атрибуты, добавив начальный тег для каждого варианта, а затем установив значение в классе компонента.

person raghav chopra    schedule 17.09.2012
comment
Где находится этот класс бобов. Я имею в виду, в каком пакете исходного кода Asmack? - person Sheraz Ahmad Khilji; 17.09.2012
comment
@SherazKhilji Так что мне нужно, чтобы я сделал Decalcare урок бобов для тебя - person raghav chopra; 17.09.2012
comment
Да, пожалуйста. Я новичок в XMPP, поэтому, пожалуйста - person Sheraz Ahmad Khilji; 17.09.2012
comment
Сэр. Приведенный выше код предназначен для написания синтаксического анализатора XML. Я хочу получать пользовательские пакеты XML. У меня уже есть парсер XML. Пожалуйста, прочитайте вопрос еще раз - person Sheraz Ahmad Khilji; 17.09.2012
comment
Извините за это, но с моим отредактированным выше кодом вы можете получить значение атрибутов в xml - person raghav chopra; 17.09.2012