How to get custom attribute value from XMPP XML message?

Ok guys, a simple question, but very important to me.

so another android client sends this xml msg:

<message id='6ymdM-19' to=' xox@xox.xox /smack' type='chat'> <subject>normal</subject> <received xmlns='urn:xmpp:receipts' id='HVgQw-5'/> </message> 

and my listener is something like this:

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

in this case, I want to get the value of the "id" attribute, inside the "received" element tag. but what i got in my log is as follows:

 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: org.jivesoftware.smack.packet.DefaultPacketExtension@44f10430 

So how can I get 'HVgQw-5' ??

UPDATE

There is actually something strange there ... I get xml accordinh from my SMACK debugging as follows:

  < D/SMACK(320): 05:40:28 PM RCV (1156991856): message id="6ymdM-19" to=" syeikh@emass.sangkuriang.co.id /Smack" from=" emu22@emass.sangkuriang.co.id /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> 

But when I execute message.toXML, it just prints like this:

 XML Chat: <message id="6ymdM-19" to=" syeikh@emass.sangkuriang.co.id /Smack" from=" emu22@emass.sangkuriang.co.id /Smack" type="chat"><subject>normal</subject><thread>cr0900</thread>**<received xmlns="urn:xmpp:receipts">**</received><active xmlns="http://jabber.org/protocol/chatstates" /></message> 

Why is this happening? why am i missing the "id"?

+7
source share
1 answer

About the identifier, first get the extension descriptor, and then find the identifier, therefore

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

Related discussion

asmack - receive custom xml messages

1) define your EmbeddedPacketExtension (so you get the handle to this, not the DefaultPacketExtension provided by SMACK)

2) A provider that extends EmbeddedExtensionProvider

3) registerProvider that you just created using Namespace

:

  /** * 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()); 
+10
source

All Articles