私はカスタムXMLメッセージをサーバーからクライアントに送信しています。 AndroidはカスタムXMLメッセージの処理方法を知っているクライアントです。 asmack(私はメッセージの送受信に使用しています)の問題は、メッセージ自体を解析しようとすることです。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>
が、私はカスタムExtenstionプロバイダーを追加している:playerlistのメッセージ例は次のとおりです
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";
}
}
Iのデバッグ次の出力を得る:
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が実際に呼び出されています。 、どのように私はそれがデフォルトのAndroidパケットの拡張子によって解析されることなく、基本的なXMLメッセージを受信するXMLPlayerListProviderを変えることができるようoutputedているものである私は推測する:私の質問は今ある
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){}"があります。 –
eleanor