我正在从服务器向客户端发送自定义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>
答案 0 :(得分:1)
我建议您不要通过尝试解析现有的名称空间来覆盖现有的提供程序,因为这只会导致混淆和可能的错误(如@Christopher所述)
尝试使用EmbeddedExtensionProvider进行解析,因为它会为您处理大部分标记处理,并将自定义xml简化为您所需的内容。这似乎是玩家元素。