3
我正在將自定義XML消息從服務器發送到客戶端。 Android是一個應該知道如何處理自定義XML消息的客戶端。 asmack(我用來接收/發送消息)的問題是它試圖解析消息本身。在playerlist的示例消息如下:asmack - 接收自定義XML消息
<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中,我加入一個自定義Extenstion提供有:
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="[email protected]" from="[email protected]" type="chat"><body>
test1
test2
</body><thread>
在這裏我們可以看到有些奇怪的事情正在發生,但PacketExtension確實被調用。我現在的問題是:如何可以改變XMLPlayerListProvider領取基本XML消息,而不會被默認的Android包擴展,這是我猜解析是什麼outputed爲:
test1
test2
這應該是:
<players xmlns="boxer:players" command="playerlist">
<player>test1</player>
<player>test2</player>
</players>
是否有一個特定的原因,你是在HTML標記中使用現有的XMPP名稱空間包裝消息? XHTML-IM解析器可能正在拾取消息並解析它們? – 2012-01-16 22:22:32
這只是爲了測試,我現在已將其更改爲。我無法爲此定義自己的類,因爲有一個監聽器「public void processMessage(Chat c,Message m){}」,它接受Message作爲輸入參數。 –
eleanor
2012-01-18 18:55:27