Как получить значение пользовательского атрибута из XML-сообщения XMPP? - PullRequest
7 голосов
/ 23 марта 2012

Хорошо, ребята, простой вопрос, но довольно важный для меня.

Итак, другой клиент 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());
    }

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

в этом случае я хочу получить значение атрибута "id" внутри тега элемента "receive". но то, что я получил в своем журнале, выглядит так:

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

На самом деле есть что-то странное ... Я получил xml accordinh от моего SMACK-отладки следующим образом:

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

Ответы [ 3 ]

12 голосов
/ 09 мая 2012

Об идентификаторе, сначала получите дескриптор расширения, затем найдите идентификатор, поэтому

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

Связанное обсуждение: asmack - получение пользовательских сообщений XML

  1. определите EmbeddedPacketExtension (таким образом, вы получите указатель на это вместо DefaultPacketExtension, предоставленного SMACK)

  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());
0 голосов
/ 29 июня 2018

Существует другой способ получения значения атрибута, который определяет метод UserInfo4XMPP путем реализации ExtensionElement:

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.

0 голосов
/ 27 июня 2018

Вы не можете достичь этого без изменения исходного кода.И правильный подход в XMPP - создавать расширения стандартных пакетов, а не изменять их.Вы можете сослаться на Невозможно прочитать пользовательские атрибуты из сообщения TAG при использовании библиотеки asmack XMPP для Android? ,, которая предоставляет подробности.

...