asmack - 接收定制的XML消息 [英] asmack - receiving custom XML messages

查看:202
本文介绍了asmack - 接收定制的XML消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从服务器发送自定义XML消息给客户。一个Android是一个客户端,它应该知道如何处理自定义XML消息。与asmack问题(我使用的用于接收/发送邮件)是它试图解析消息本身。在playerlist的例子消息如下:

 < HTML的xmlns =htt​​p://jabber.org/protocol/xhtml-im>
<车身的xmlns =htt​​p://www.w3.org/1999/xhtml>
  <玩家的xmlns =拳击手:玩家命令=playerlist>
    <玩家GT;&TEST1 LT; /播放机和GT;
    <玩家GT; test2的< /播放机和GT;
  < /播放器及GT;
< /身体GT;
< / HTML>

在Android中,我加入了自定义的Extenstion提供者:

<$p$p><$c$c>ProviderManager.getInstance().addExtensionProvider(\"html\",\"http://jabber.org/protocol/xhtml-im\",新XMLPlayerListProvider());

而XMLPlayerListProvider

 类XMLPlayerListProvider实现PacketExtensionProvider {
  公共XMLPlayerListProvider(){}  公共PacketExtension parseExtension(XmlPullParser解析器){
    Log.w(********** HHHHHHHHHHHHH ***********,0);
    布尔停止=假;
    INT evtType;
    字符串n;
    字符串ID = NULL;
    Log.w(START:+ XmlPullParser.START_TAG,0);
    而(!停止){
      尝试{
       evtType = parser.next();
       N = parser.getName();
       开关(evtType){
          案例XmlPullParser.START_TAG:
             如果(身体.equals(N))
                Log.w(身+ n.toString(),0);
             否则如果(运动员.equals(n))的
                Log.w(玩家,0);
             否则如果(玩家.equals(n))的
                Log.w(播放,0);
             打破;
          案例XmlPullParser.END_TAG:
             //停止解析的时候我们打&LT; /项目&GT;
             停止=身.equals(N);
             打破;
       }
      }赶上(例外五){
        e.printStackTrace();
      }
    }    返回新XMLPlayerList();
  }
}类XMLPlayerList实现PacketExtension {  公共字符串getElementName(){
    返回AAAAA
  }  公共字符串getNamespace(){
    返回AAAAA
  }  公共toxml用于字符串(){
    返回AAAAA
  }}

在调试我得到以下输出:

  W / ********** HHHHHHHHHHHHH ***********(654):0
W / START:2(654):0
W / BODYbody(654):0
D / SMACK(654):下午11时11分58秒RCV(1156379984):普通话​​=playerlist&GT;
D / SMACK(654):其中,玩家GT;&TEST1 LT; /播放机和GT;
D / SMACK(654):其中,玩家GT; test2的&LT; /播放机和GT;
D / SMACK(654):其中,/播放器及GT;
D / SMACK(654):其中,/身体GT;&LT; / HTML&GT;&LT;螺纹&GT; 8rOVz0&LT; /线程&GT;&LT; /消息&GT;&LT;智商
W /播放器(654):0
W /播放器(654):0
W /播放器(654):0
W /响应:&LT;消息ID =15为=EEE @ localhost的距离=管理@ localhost的类型=聊天&GT;&LT;身体GT;
TEST1
TEST2&LT; /身体GT;&LT;螺纹&GT;

在这里,我们可以看到一些奇怪的事情是怎么回事,但PacketExtension确实得到调用。我现在的问题是:我怎样才能改变XMLPlayerListProvider领取基本XML消息而不会被默认的Andr​​oid包扩展,我的猜测是解析什么是所输出的是:

  TEST1
TEST2

这应该是:

 &LT;玩家的xmlns =拳击手:玩家命令=playerlist&GT;
    &LT;玩家GT;&TEST1 LT; /播放机和GT;
    &LT;玩家GT; test2的&LT; /播放机和GT;
  &LT; /播放器及GT;


解决方案

我建议你不试图解析现有的命名空间覆盖现有的供应商,因为这只会造成混乱和可能出现的错误(如@Christopher提及)

尝试使用 EmbeddedExtensionProvider 做你的分析,因为它需要的大部分标签为你办理的照顾,以及简化您的自定义XML来你只需要什么。这似乎是在玩家元素。

I'm sending custom XML messages from server to clients. An Android is a client which should know how to handle custom XML messages. The problem with asmack (which I'm using for receiving/sending messages) is that it tries to parse the message itself. An example message of the playerlist is the following:

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

In Android, I'm adding a custom Extenstion Provider with:

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

And the 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";
  }

}

When debugging I'm getting the following output:

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>

Here we can see that something strange is going on, but the PacketExtension is indeed getting called. My question now is: how can I change the XMLPlayerListProvider to receive the basic XML message without it being parsed by the default Android packet extension, which I guess is what's outputed as:

test1
test2

That should be:

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

解决方案

I would recommend that you not override existing providers by trying to parse existing namespaces, since that will only cause confusion and possible errors (as mentioned by @Christopher)

Try using the EmbeddedExtensionProvider to do your parsing as it takes care of most of the tag handling for you, and simplify your custom xml to what you need only. Which appears to be the players element.

这篇关于asmack - 接收定制的XML消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆