如何从一个XMPP XML消息的自定义属性值?自定义、属性、消息、XMPP

2023-09-13 23:56:40 作者:一万颗酸柠檬

玉家伙,简单的问题,但pretty的对我很重要。

Ok guys, simple question but pretty important to me.

那么,其他的Andr​​oid客户端发送该XML消息:

so, other android client are sending 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 roughly 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());
    }

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

在这种情况下,我想获得的属性ID的值,里面的接受元素标签。 但我得到了我的记录是这样的:

in this case I want to get the value of attribute "id", inside the "received" element tag. but what I got on my Log is like this:

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'??

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

更新

其实有一些奇怪... 我有收到我SMACK调试XML accordinh是这样的:

Actually there's something weird... I have receive the xml accordinh from my SMACK debug like this:

 <
 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它只是打印出这样的:

But when I execute message.toXML it's just print out 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 this is happening? why do I miss the "id" ?

推荐答案

关于ID,第一个得到扩展的句柄然后查找ID,所以

About the ID, first get a handle on extension then look for ID, so

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

相关讨论

asmack - 接收定制的XML消息

1)定义EmbeddedPacketExtension(所以你得到的这个,而不是由SMACK提供DefaultPacketExtension)

1) define your EmbeddedPacketExtension ( so you get a handle on this instead of DefaultPacketExtension provided by SMACK )

2)扩展EmbeddedExtensionProvider提供者

2) A provider that extends EmbeddedExtensionProvider

3)registerProvider你命名空间刚刚创建

3) registerProvider you just created with Namespace

code如下:

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