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 ответ:
Я бы рекомендовал вам не переопределять существующие поставщики, пытаясь проанализировать существующие пространства имен, так как это только вызовет путаницу и возможные ошибки (как упоминалось @Christopher)
Попробуйте использовать EmbeddedExtensionProvider для выполнения синтаксического анализа, поскольку он берет на себя большую часть обработки тегов для вас, и упростите пользовательский xml до того, что вам нужно. Который, по-видимому, является элементомигроков .