2012-03-23 11 views
7

Bien chicos, pregunta simple pero muy importante para mí.¿Cómo obtener el valor de atributo personalizado de un mensaje XMPP XML?

así, otro cliente de Android están enviando este XML msg:

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

y mi oyente es más o menos así:

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()); 
    } 

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

en este caso quiero para obtener el valor del atributo "id ", dentro de la etiqueta del elemento" recibido ". pero lo que tengo en mi registro es la siguiente:

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] 

Entonces, ¿cómo puedo conseguir el 'HVgQw-5' ??

ACTUALIZACIÓN

En realidad hay algo raro ... tengo recibir el accordinh xml de mi depuración TORTAZO así:

< 
D/SMACK(320): 05:40:28 PM RCV (1156991856): message id="6ymdM-19" 
to="syeikh[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> 

Pero cuando ejecuto message.toXML Es sólo imprimo de esta manera:

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> 

¿Por qué ocurre esto? ¿Por qué extraño el "id"?

Respuesta

10

Sobre el ID, primero tener una idea de la extensión luego buscar la identificación, discusión hasta

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

relacionada

asmack - receiving custom XML messages

1) definir su EmbeddedPacketExtension (para que pueda obtener una manija en esto en lugar de DefaultPacketExtension proporcionado por SMACK)

2) Un proveedor que extiende EmbeddedExtensionProvider

3) registerProvider que acaba de crear con el espacio de nombres de código

sigue:

     /** 
        * 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

más uno para la primera parte de la respuesta. – EagleEye

Cuestiones relacionadas