2017-05-18 27 views
0

Stax 및 XStream을 처음 사용했습니다. 거대한 XML 스트림에서 일반적인 요소를 unmarshall하려고합니다. (비 정렬 화하려면 150 만에서 250 만 개의 요소가있을 수 있습니다)StAX에서 XStream 파싱 부분 입력을 만드는 방법

Stax로 스트림을 파싱하여 관심있는 요소로 가져온 다음 xStream XML을 EndElement까지 마샬링 해제합니다.

XMLStreamReader reader = xmlInputFactory.createXMLStreamReader(fis); 
      while (reader.hasNext()) { 
       if (reader.isStartElement() && reader.getLocalName().toLowerCase().equals("person")) { 
        break; 
       } 
       reader.next(); 
      } 

      StaxDriver sd = new StaxDriver(); 
      AbstractPullReader rd = sd.createStaxReader(reader); 
      XStream xstream = new XStream(sd); 
      xstream.registerConverter(new PersonConverter()); 
      Person p = (Person) xstream.unmarshal(rd); 

나는 <Persons> <Person> <name>A</name> </Person> <Person> <name>B</name> </Person> <Person> <name>C</name> </Person> </Persons>

이의 문제가 먼저 내 컨버터가 호출되지 않은 테스트 입력을 만들 수 있습니다. 둘째, Person의 "name"요소에 대해 CannotResolveClassException이 발생하고 XStream이 Person 객체를 만들지 않습니다. 내 코드에서 무엇을 놓치셨습니까?

답변

1

AbstractPullReader을 인스턴스화하면 스트림에서 첫 번째 열린 요소 이벤트를 읽고 "루트"요소를 설정합니다. 이미 첫 번째 Person 이벤트를 읽었으므로 다음 이벤트 (name)로 진행할 것이므로 비동기 해제 방법을 알 수 없습니다.

당신은 예를 들어 작업을하기 위해 두 가지를해야 할 것이다 : 당신의 자바 클래스

xstream.alias("Person", Person.class); 

두 번째로 요소 이름 Person 별명

첫 번째 만에 SAX 커서를 전진 요소 전에 읽고 싶은 사람 :

while (reader.hasNext()) {   
    if (reader.isStartElement() && reader.getLocalName().equals("Persons")) {    
     break; 
    } 
    reader.next(); 
} 
+0

감사합니다. 그것은 작동하지만 그 다음에 내가 분석하고 싶은 요소 앞에 하나의 요소를 멈추게해야합니다. 사람이 첫 번째 자녀로 몇 가지 선택 요소를 포함 할 수 있다면 어떨까요? StAX reader API는 "look ahead"메소드를 제공하지 않습니다. – Bassam