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

, 내가 가진 사용자 정의 확장 파일 공급자를 추가 해요 : 다음 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> 
+2

메시지를 HTML 태그로 래핑하고 기존 XMPP 네임 스페이스를 사용하는 특별한 이유가 있습니까? 아마도 XHTML-IM 파서가 메시지를 가져 와서 구문 분석을하고 있을까요? –

+0

테스트 용 이었으므로 지금은 으로 변경했습니다. 메시지를 입력 매개 변수로 받아들이는 리스너 "public void processMessage (Chat c, Message m) {}"이 있기 때문에 자체 클래스를 정의 할 수 없습니다. – eleanor

답변

1

내가 그는 혼란과 가능한 오류가 발생할 수 있기 때문에 (@Christopher에서 언급 한 바와 같이) 당신은, 기존의 네임 스페이스를 구문 분석을 시도하여 기존 공급자를 오버라이드 (override)하지 않는 것이 좋습니다 것입니다

당신의 파르을 수행 할 EmbeddedExtensionProvider를 사용해보십시오 대부분의 태그 처리를 처리하고 필요에 맞게 사용자 정의 XML을 단순화합니다. 어느 플레이어 요소가 나타납니다.