서버에서 클라이언트로 사용자 정의 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>
, 내가 가진 사용자 정의 확장 파일 공급자를 추가 해요 : 다음 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이 실제로 불려지는 것을 알 수 있습니다. 내 질문은 지금 : 나는 그것이 내가 생각 기본 안드로이드 패킷 확장에 의해 구문 분석하지 않고 기본적인 XML 메시지를받을 수 XMLPlayerListProvider을 변경하는 방법 아웃풋이 무슨 같이 :
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