2012-03-23 1 views
7

Хорошо, ребята, простой вопрос, но очень важный для меня.Как получить значение настраиваемого атрибута из XML-сообщения XMPP?

так, другой андроид клиент отправляет XML Сообщ:

<message 
    id='6ymdM-19' 
    to='[email protected]/smack' 
    type='chat'> 
    <subject>normal</subject> 
    <received xmlns='urn:xmpp:receipts' id='HVgQw-5'/> 
</message> 

и мой слушатель примерно так:

private class MsgListener implements ChatStateListener { 
/** 
* Constructor. 
*/ 
public MsgListener() { 
} 

@Override 
public void processMessage(Chat chat, org.jivesoftware.smack.packet.Message message) { 
    String xmlMessage = message.toXML(); 
    Log.v(TAG, "XML Chat: "+xmlMessage); 
    // getExtension namespace try urn:xmpp:receipts 
    if(xmlMessage.contains("<request xmlns=")) { 
     Log.d(TAG, "new chat message arrive! reply with RECEIVED!"); 
     replyReceived(message); 
    } else if(xmlMessage.contains("<received xmlns=")) { 
     Log.d(TAG, "RECEIVED notification arrived!"); 
     PacketExtension statusExtension = 
       message.getExtension("urn:xmpp:receipts"); 
     Log.d(TAG, "Extension name: "+statusExtension.getElementName()); 
     Log.d(TAG, "Extension XML: "+statusExtension.toXML()); 
     Log.d(TAG, "Extension string: "+statusExtension.toString()); 
    } 

    .... 
    .... 
    .... 
} 

в этом случае я хочу, чтобы получить значение атрибута «Идентификатор ", внутри" полученного "тега элемента. , но то, что я получил на мой журнал, как это:

RECEIVED notification arrived! 
D/ChatAdapter(320): Extension name: received 
D/ChatAdapter(320): Extension XML: <received xmlns="urn:xmpp:receipts"></received> 
D/ChatAdapter(320): Extension string:    
[email protected] 

Так как я могу получить «HVgQw-5» ??

UPDATE

На самом деле есть что-то странное ... у меня есть получить XML accordinh от моего привкусом отладки, как это:

< 
D/SMACK(320): 05:40:28 PM RCV (1156991856): message id="6ymdM-19" 
to="[email protected]/Smack" from="[email protected]/Smack" 
type="chat"><subject> 
D/SMACK(320): 05:40:28 PM RCV (1156991856): normal</subject><thread>cr0900</thread> 
**<received xmlns="urn:xmpp:receipts" id="HVgQw-5"/>**<active  
xmlns="http://jabber.org/protoc 
D/SMACK(320): 05:40:28 PM RCV (1156991856): ol/chatstates"/></message> 

Но когда я исполню message.toXML это просто распечатать например:

XML Chat: <message id="6ymdM-19" to="[email protected]/Smack" from="[email protected]/Smack" type="chat"><subject>normal</subject><thread>cr0900</thread>**<received xmlns="urn:xmpp:receipts">**</received><active xmlns="http://jabber.org/protocol/chatstates" /></message> 

Почему это происходит? почему я пропускаю «id»?

ответ

10

О ID, сначала нужно получить ручку на расширение затем искать ID, так

DeliveryReceipt deliveryReceiptObj =(DeliveryReceipt) message.getExtension(DeliveryReceipt.NAMESPACE); 
    // ID below is what you want 
    deliveryReceiptObj.getId(); 

Связанные обсуждение

asmack - receiving custom XML messages

1) определить свой EmbeddedPacketExtension (так что вы получите ручку это вместо DefaultPacketExtension, предоставленного SMACK)

2) Поставщик, который расширяет EmbeddedExtensionProvider

3) registerProvider вы только что создали с пространством имен

кода следующим образом:

     /** 
        * User: suvrat 
        * Represents a <b>message delivery receipt</b> entry as specified by 
        * <a href="http://xmpp.org/extensions/xep-0184.html">Message Delivery Receipts</a>. 
        * 
        */ 
        import org.jivesoftware.smack.packet.PacketExtension; 

        public class DeliveryReceipt implements PacketExtension 
       { 
         public static final String NAMESPACE = "urn:xmpp:receipts"; 

        private String id; /// original ID of the delivered message 

        public DeliveryReceipt(String id) 
        { 
         this.id = id; 
        } 

        public String getId() 
        { 
         return id; 
        } 

        public String getElementName() 
        { 
         return "received"; 
        } 

        public String getNamespace() 
        { 
         return NAMESPACE; 
        } 

        public String toXML() 
        { 
         return "<received xmlns='" + NAMESPACE + "' id='" + id + "'/>"; 
        } 
       } 

       /** 
       * User: suvrat 
       * The DeliveryReceiptProvider parses DeliveryReceipt packets. 
       */ 

       */ 
       import org.jivesoftware.smack.packet.PacketExtension; 
       import org.jivesoftware.smackx.provider.EmbeddedExtensionProvider; 
       import org.xmlpull.v1.XmlPullParser; 

       import java.util.List; 
       import java.util.Map; 

       public class DeliveryReceiptProvider extends EmbeddedExtensionProvider 
       { 

        @Override 
        protected PacketExtension createReturnExtension(String currentElement, String currentNamespace, 
          Map<String, String> attributeMap, List<? extends PacketExtension> content) 
        { 
         return new DeliveryReceipt(attributeMap.get("id")); 
        } 

       } 

         //3.) finally where ever you would like to parse packet 
        ProviderManager.getInstance().addExtensionProvider("received", DeliveryReceipt.NAMESPACE, new DeliveryReceiptProvider()); 
+0

плюс один для первой части ответа. – EagleEye