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 解析器正在拾取您的消息并对其进行解析? 只是测试用的,我现在改成我建议您不要通过尝试解析现有命名空间来覆盖现有提供程序,因为这只会导致混淆和可能的错误(如 @Christopher 所述)
尝试使用 EmbeddedExtensionProvider 进行解析,因为它会为您处理大部分标签,并将您的自定义 xml 简化为您只需要的内容。这似乎是 players 元素。
【讨论】:
以上是关于asmack - 接收自定义 XML 消息的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 上使用 aSmack 发送和接收自定义 XMPP IQ