【问题标题】:How to get custom attribute value from an XMPP XML message?如何从 XMPP XML 消息中获取自定义属性值?
【发布时间】:2012-04-07 22:38:30
【问题描述】:

好的,伙计们,这个问题很简单,但对我来说很重要。

所以,其他 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”??

更新

其实有什么奇怪的... 我从我的 SMACK 调试中收到了 xml 协议,如下所示:

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

【问题讨论】:

    标签: java android xmpp smack


    【解决方案1】:

    还有另一种获取属性值的方法,通过实现ExtensionElement定义方法UserInfo4XMPP:

    import org.jivesoftware.smack.packet.ExtensionElement;
    public class UserInfo4XMPP implements ExtensionElement{
        public static final String NAMESPACE = "urn:xmpp:receipts";
        private String elementName = "received ";
        private String id = "";    
        @Override
        public String getElementName() {
            return elementName;
        }
            @Override
        public CharSequence toXML() {  
            return "<received xmlns='" + NAMESPACE + "' id='" + id + "'/>";
        }
        @Override
        public String getNamespace() {
            return NAMESPACE;
        }
        public String getId()
        {
            return id;
        }
    }
    

    函数体类似于DeliveryReceiptProvider。

    【讨论】:

      【解决方案2】:

      关于ID,先获取extension的句柄再找ID,所以

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

      相关讨论: asmack - receiving custom XML messages

      1. 定义你的EmbeddedPacketExtension(这样你就可以处理这个而不是SMACK提供的DefaultPacketExtension

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

      【讨论】:

      • 答案的第一部分加一个。
      【解决方案3】:

      不修改源代码是无法实现的。 XMPP 中的正确方法是创建标准数据包的扩展,而不是修改它们。 可以参考Cannot Read Custom Attributes From Message TAG when using asmack XMPP library for android?,里面有详细介绍。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-18
        • 1970-01-01
        • 2014-10-24
        • 1970-01-01
        • 1970-01-01
        • 2019-03-24
        • 2012-09-09
        • 1970-01-01
        相关资源
        最近更新 更多