2012-01-16 85 views
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> 
+2

是否有一個特定的原因,你是在HTML標記中使用現有的XMPP名稱空間包裝消息? XHTML-IM解析器可能正在拾取消息並解析它們? – 2012-01-16 22:22:32

+0

這只是爲了測試,我現在已將其更改爲。我無法爲此定義自己的類,因爲有一個監聽器「public void processMessage(Chat c,Message m){}」,它接受Message作爲輸入參數。 – eleanor 2012-01-18 18:55:27

回答

1

我建議你不要試圖解析現有的命名空間覆蓋現有的供應商,因爲這隻會造成混亂和可能出現的錯誤(如@Christopher提到的)

嘗試使用EmbeddedExtensionProvider做你的帕西因爲它爲您處理大部分標籤處理,並將您的自定義xml簡化爲您所需要的。這似乎是玩家元素。