asmack - 接收自定义XML消息

时间:2012-01-16 22:17:34

标签: java android xmpp

我正在从服务器向客户端发送自定义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>

1 个答案:

答案 0 :(得分:1)

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

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