asmack-получение пользовательских XML-сообщений


Я отправляю пользовательские 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>
Здесь мы можем видеть, что происходит что-то странное, но пакетное расширение действительно вызывается. Теперь мой вопрос: как я могу изменить XMLPlayerListProvider для получения основного XML-сообщения без его разбора с помощью расширения пакета Android по умолчанию, которое, я думаю, является тем, что выводится как:
test1
test2

Это должно быть:

  <players xmlns="boxer:players" command="playerlist">
    <player>test1</player>
    <player>test2</player>
  </players>
1 3

1 ответ:

Я бы рекомендовал вам не переопределять существующие поставщики, пытаясь проанализировать существующие пространства имен, так как это только вызовет путаницу и возможные ошибки (как упоминалось @Christopher)

Попробуйте использовать EmbeddedExtensionProvider для выполнения синтаксического анализа, поскольку он берет на себя большую часть обработки тегов для вас, и упростите пользовательский xml до того, что вам нужно. Который, по-видимому, является элементомигроков .