如何从XMPP XML消息中获取自定义属性值?
发布时间:2020-12-16 07:46:13 所属栏目:百科 来源:网络整理
导读:好的,简单的问题,但对我来说非常重要. 所以,其他Android客户端正在发送此xml消息: message id='6ymdM-19' to='xox@xox.xox/smack' type='chat' subjectnormal/subject received xmlns='urn:xmpp:receipts' id='HVgQw-5'//message 我的听众大致是这样的: pr
好的,简单的问题,但对我来说非常重要.
所以,其他Android客户端正在发送此xml消息: <message id='6ymdM-19' to='xox@xox.xox/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”元素标记内获取属性“id”的值. 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 那我怎么能得到’HVgQw-5’? UPDATE 实际上有一些奇怪的东西…… < 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> 但是当我执行message.toXML时,它就像这样打印出来: 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> 为什么会这样?为什么我会错过“id”?
关于ID,首先获取扩展句柄然后查找ID,这样
DeliveryReceipt deliveryReceiptObj =(DeliveryReceipt) message.getExtension(DeliveryReceipt.NAMESPACE); // ID below is what you want deliveryReceiptObj.getId(); 相关讨论: >定义您的EmbeddedPacketExtension(因此您可以获得此处理而不是SMACK提供的DefaultPacketExtension) 代码如下: /** * 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()); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |