2012-01-16 22 views
3

私はカスタム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> 
+2

メッセージをHTMLタグでラップし、既存のXMPP名前空間を使用する特別な理由はありますか?おそらくXHTML-IMパーサーがあなたのメッセージをピックアップして解析していますか? –

+0

これはテストのためだけだったので、今度はに変更しました。そして、自分自身のクラスを定義することはできません。メッセージを入力パラメータとして受け入れるリスナー "public void processMessage(Chat c、Message m){}"があります。 – eleanor

答えて

1

私はそれが唯一の混乱と可能性のあるエラーの原因となりますので、(@Christopherで述べたように)あなたは、既存の名前空間を解析しようとすることで、既存のプロバイダをオーバーライドしないことをお勧めし

あなたのパールシーを行うためにEmbeddedExtensionProviderを使用してみてくださいそれはあなたのためのタグ処理の大部分を担当し、カスタムxmlを必要なものだけに単純化します。これは、プレイヤー要素のようです。

関連する問題