【发布时间】: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 作为输入参数。