asmack - 接收自定义 XML 消息

Posted

技术标签:

【中文标题】asmack - 接收自定义 XML 消息【英文标题】:asmack - receiving custom XML messages 【发布时间】:2012-01-16 22:17:34 【问题描述】:

我正在从服务器向客户端发送自定义 XML 消息。 android 是一个应该知道如何处理自定义 XML 消息的客户端。 asmack(我用于接收/发送消息)的问题在于它试图解析消息本身。播放器列表的示例消息如下:

<html xmlns="http://jabber.org/protocol/xhtml-im">
<body xmlns="http://www.w3.org/1999/xhtml">
  <players xmlns="boxer:players" command="playerlist">
    <player>test1</player>
    <player>test2</player>
  </players>
</body>
</html>

在 Android 中,我添加了一个自定义扩展提供程序:

ProviderManager.getInstance().addExtensionProvider("html","http://jabber.org/protocol/xhtml-im", new XMLPlayerListProvider());

还有 XMLPlayerListProvider

class XMLPlayerListProvider implements PacketExtensionProvider 
  public XMLPlayerListProvider() 

  public PacketExtension parseExtension(XmlPullParser parser) 
    Log.w("**********HHHHHHHHHHHHH***********", "0");
    boolean stop = false;
    int evtType;
    String n;
    String id = null;
    Log.w("START: "+XmlPullParser.START_TAG, "0");
    while (!stop) 
      try 
       evtType = parser.next();
       n = parser.getName();
       switch (evtType) 
          case XmlPullParser.START_TAG:
             if ("body".equals(n))
                Log.w("BODY"+n.toString(), "0"); 
             else if ("players".equals(n))
                Log.w("PLAYERS", "0");
             else if ("player".equals(n))
                Log.w("PLAYER", "0");
             break;
          case XmlPullParser.END_TAG:
             //Stop parsing when we hit </item>
             stop = "body".equals(n);
             break;
       
       catch(Exception e) 
        e.printStackTrace();
      
    

    return new XMLPlayerList();
   




class XMLPlayerList implements PacketExtension 

  public String getElementName() 
    return "aaaaa";
  

  public String getNamespace() 
    return "aaaaa";
  

  public String toXML() 
    return "aaaaa";
  


调试时我得到以下输出:

W/**********HHHHHHHHHHHHH***********(  654): 0
W/START: 2(  654): 0
W/BODYbody(  654): 0
D/SMACK   (  654): 11:11:58 PM RCV  (1156379984): mand="playerlist">
D/SMACK   (  654): <player>test1</player>
D/SMACK   (  654): <player>test2</player>
D/SMACK   (  654): </players>
D/SMACK   (  654): </body></html><thread>8rOVz0</thread></message><iq
W/PLAYERS (  654): 0
W/PLAYER  (  654): 0
W/PLAYER  (  654): 0
W/RESPONSE: <message id="15" to="eee@localhost" from="admin@localhost" type="chat"><body>
test1
test2

</body><thread>

在这里我们可以看到发生了一些奇怪的事情,但 PacketExtension 确实被调用了。我现在的问题是:如何更改 XMLPlayerListProvider 以接收基本的 XML 消息,而不会被默认的 Android 数据包扩展名解析,我猜这是输出为:

test1
test2

应该是:

  <players xmlns="boxer:players" command="playerlist">
    <player>test1</player>
    <player>test2</player>
  </players>

【问题讨论】:

您将消息包装在 HTML 标记中并使用现有的 XMPP 命名空间是否有特殊原因?可能 XHTML-IM 解析器正在拾取您的消息并对其进行解析? 只是测试用的,我现在改成了。我无法为此定义自己的类,因为有一个监听器“public void processMessage(Chat c, Message m) ”,它接受 Message 作为输入参数。 【参考方案1】:

我建议您不要通过尝试解析现有命名空间来覆盖现有提供程序,因为这只会导致混淆和可能的错误(如 @Christopher 所述)

尝试使用 EmbeddedExtensionProvider 进行解析,因为它会为您处理大部分标签,并将您的自定义 xml 简化为您只需要的内容。这似乎是 players 元素。

【讨论】:

以上是关于asmack - 接收自定义 XML 消息的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 上使用 aSmack 发送和接收自定义 XMPP IQ

Android aSmack - 如何为文件发送自定义消息扩展名?

Android中实现自定义XMPP消息包收发

Android中实现自定义XMPP消息包收发

Android中实现自定义XMPP消息包收发

如何在消息 asmack/smack 中添加其他数据?