2014-12-12 1 views
0

XmlPullParser를 사용하기 위해 묶여 있습니다 (Smack XMPP 라이브러리를 사용하기 때문에). 그러나 XML을 구문 분석하고 (적어도 XSD가 제공된 경우) 읽기 값을 bean에 넣는 것은 매우 불편합니다. 반대로 JAXB는 훨씬 쉽게 작업 할 수 있습니다.XmlPullParser : 원시 XML 가져 오기/다시 생성

또한 직렬화의 경우 문자열을 수동으로 연결하는 "구식이고 오류가 발생하기 쉬운 방법"입니다. (또한 동의어를 요약 한 http://babbler-xmpp.blogspot.co.at/2014_01_01_archive.html의 동기 부여 참조).

그러나 역 직렬화에 JAXB를 사용하려면 원시 XML 문자열을 얻어야합니다. 물론, XmlPullParser의 파싱 메서드 (예 : getName(), getText(), getAttributes() ...)를 사용하여 전체 XML 문자열을 재구성하는 것이 한 가지 방법입니다. 그러나 저는 이것을 피하고 싶습니다.

그래서 특정 태그 (예 : XmlPullParser가 현재 가리키고있는 곳)의 전체 원시 XML 문자열을 가져올 수 있습니까? 또는 누군가가 XmlPullParser 인스턴스의 XML을 재구성하는 유틸리티를 알고 있습니까?

+0

당신은 XmkPullParser 어떤 리더를 전달하는 것 같습니다? 왜 모든 것을 두 번 읽지 않는가? POJO hieratchy를 생성하기 위해 JAXB를 사용하려는 경우 : XML을 풀 해석하는 목적은 무엇입니까? – laune

+0

문제는 원시 XML 스트림을 나타내는 Reader에 대한 액세스 권한이 없다는 것입니다. 프레임 워크 (Smack)에서 내 사용자 지정 확장에 전달 된 XmlPullParser 만 있습니다. – MrD

답변

0

원시 XML 문자열을 가져 오는 다른 방법이없는 것 같기 때문에 위의 질문에서 설명한대로 XmlPullParser의 구문 분석 방법을 사용하여 XML 문자열을 다시 구성하기로 결정했습니다. 사람이 그것을 필요로 그냥 경우

제 1 초안에서이 코드는이

int eventType = parser.getEventType(); 
String extensionElementName = parser.getName(); 
StringBuilder extensionBuilder = new StringBuilder(); 
String element = ""; 

while(!(eventType == XmlPullParser.END_TAG && parser.getName().equalsIgnoreCase(extensionElementName))) { 
    if(eventType == XmlPullParser.END_TAG && parser.getText().equalsIgnoreCase(element)) { 
     // this is for elements which are closed immediately like the following example: <sample /> 
     // otherwise, this line would be added twice 
    } else { 
     extensionBuilder.append(parser.getText()); 
    } 

    element = parser.getText(); 
    eventType = parser.next(); 
} 

// append closing element 
if(!parser.getText().equalsIgnoreCase(element)) 
    extensionBuilder.append(parser.getText());