2016-07-27 2 views
0

미안 POJO로 매핑 XML로 잭슨 XmlMapper을 사용하는지도하지만 다음과 같은 문제가있다 :잭슨 XmlMapper 자식 요소

내 XML이 같은 (아니 원래, 단지 예)를 찾습니다 :

<?xml version="1.0" encoding="UTF-8"?> 
<result> 
    <pojo> 
     <name>test</name> 
    </pojo> 
</result> 

문제는 내가 "결과"개체를 구문 분석 할하지는입니다. 나는 pojo를 자신의 객체로 파싱하지 않을 것이다. XmlMapper로이 작업을 수행 할 수 있습니까?

감사합니다.

아르투르

답변

1

당신은 할 수 있지만 보일러 플레이트 코드를 작성해야합니다. xml 입력을 사용자 정의하여 읽을 수 있으려면 XMLStreamReader의 인스턴스를 만들어야합니다. next() 메서드를 사용하면 판독기의 다음 파싱 이벤트로 이동할 수 있습니다. 그것은 독자의 내부 규칙과 관련된 다소 까다로운 방법입니다. Javadoc의에서

: 그래서에이 특수성을 이해하는 문서를 읽어
INT javax.xml.stream.XMLStreamReader.next()가 발생 (자), XMLStreamException

다음 구문 분석 이벤트를 가져옵니다 - 프로세서가 모두 반환 할 수 있습니다 인접한 문자 데이터를 단일 청크에 넣거나 여러 개의 청크로 분할 할 수 있습니다. javax.xml.stream.isCoalescing 속성이 true로 설정된 경우 요소 내용을 병합해야하며 하나의 CHARACTERS 이벤트 만 연속 요소 콘텐츠 나 CDATA 섹션에 대해 을 반환해야합니다. 으로 기본 엔터티 참조를 확장하고 응용 프로그램에 투명하게 보고해야합니다. 엔티티 참조 을 확장 할 수없는 경우 예외가 throw됩니다. 요소 콘텐츠가 비어 있으면 (콘텐츠가 ''인 경우) CHARACTERS 이벤트가보고되지 않습니다. 내용 textHello </인사>]]> 기타 콘텐츠를 다음 호출의 행동() foo는에있는 경우가있을 것입니다 : 다음 XML을 감안할 때

1 주석 (COMMENT) 2- 문자 섹션 빈 요소 (예)이 별개로보고됩니다 4- 다음의 문자 섹션 (다른 CHARACTERS) 5- END_ELEMENT가

주 (CHARACTERS) 3- 다음 CDATA 섹션 (다른 CHARACTERS) 이벤트 : START_ELEMENT, END_ELEMENT - 이렇게하면 빈 요소에 대한 동등성을 파싱합니다. 이 메서드는 hasNext()가 false를 돌려주는 후에 불려 갔을 경우, IllegalStateException를 throw합니다.

결과 :

@Test 
public void mapXmlToPojo() throws Exception { 
    XMLInputFactory factory = XMLInputFactory2.newFactory(); 
    InputStream inputFile = MapXmlToPojo.class.getResourceAsStream("pojo.xml"); 
    XMLStreamReader xmlStreamReader = factory.createXMLStreamReader(inputFile); 
    XmlMapper xmlMapper = new XmlMapper(); 
    xmlStreamReader.next(); 
    xmlStreamReader.next(); 
    Pojo pojo = xmlMapper.readValue(xmlStreamReader, Pojo.class); 
    Assert.assertEquals("test", pojo.getName()); 
} 
: 현재의 구문 분석 이벤트에 대응하는 정수 코드

내게는 단위 테스트를 진행하는 방법을 설명하자