2011-04-20 6 views
4

본질적으로 동일하게 구조화 된 XML 요소 목록 인 XML 문서를 반복하고 싶습니다. 요소는 Java 객체로 직렬화됩니다.Java에서 XML 요소 목록 읽기

<root> 
    <element attribute="value" /> 
    <element attribute="value" /> 
    <element attribute="value" /> 
    ... 
</root> 

루트 요소 내에 많은 요소가 있습니다. 나는 그들을 모두 메모리에로드하지 않는 것을 선호합니다. SAX 처리기를 사용할 수 있다는 것을 알았지 만 SAX 처리기를 사용하여 모든 것을 Java 객체로 비 직렬화 할 수 있습니다. JDOM은 사용하기가 매우 쉽지만 JDOM이 항상 전체 트리를 구문 분석한다고 말할 수있는 한 찾을 수 있습니다. JDOM을 사용하여 하위 요소를 한 번에 하나씩 파싱 할 수있는 방법이 있습니까?

JDOM을 사용하는 또 다른 이유는 해당 Java 객체에 대해 직렬화/직렬화 코드를 쉽게 작성할 수 있다는 점입니다. 이는 전체적으로 메모리에 없더라도 의미가 없습니다. 그러나, 나는 동시에 모든 자바 객체를 메모리에로드하고 싶지 않다. 오히려, 나는 한 번 그들을 반복하고 싶다.

업데이트 : 여기 dom4j에서 수행하는 방법의 예가 있습니다 : http://docs.codehaus.org/display/GROOVY/Reading+XML+with+Groovy+and+DOM4J. 어쨌든 jdom에서 이것을 할 수 있을까요?

+0

당신은 [JSefa] (http://jsefa.sourceforge.net/)를 봐야 할 것입니다. 그것은별로 인기는 없지만 간단하고 사용하기 쉽습니다. 예제를 다운로드하여 살펴보아야합니다. – FrVaBe

답변

0

메모리 요구 사항을 줄이는 쉬운 방법 중 하나는 JDOM과 함께 XPath를 사용하여 XML의 하위 집합을 쿼리하고 쿼리를 만족하는 비트 만 가져 오는 것입니다.

그렇지 않으면이 interesting hint from Elliotte Rusty Harold을 확인할 수 있습니다, 당신이 원하는 스트리밍 API는, 거기에 바로 광고가 아님을 나타냅니다 :

JDOM은 스트리밍 API를 가지고있다. 그것은 일종의 은밀하고 널리 알려지지 않았으며 광고되거나 설명되지 않았습니다. XOM에서이 접근 방식을 더 많이 구체화하여 문서화했습니다. 스트리밍 트리 모델이 원하는 경우 XOM을 사용하는 것이 더 나을 것입니다.하지만 JDOM 을 계속 사용해야하는 경우 XOM 예제를 읽으면 스트리밍 모드에서 JDOM을 사용하는 방법에 대한 충분한 단서를 얻을 수 있습니다.

+0

링크를 제공해 주셔서 감사합니다. 2001 년에 언급 된 스트리밍 기능을 보았습니다 (http://www.jdom.org/pipermail/jdom-interest/2000-November/002876.html). 관심이 많았지 만 어디에도 가지 않는 것 같았습니다. 나는 XPath를 조사 할 것이지만, 모든 결과를 원할 때 찾고자하는 것이 맞는지는 모르겠지만 한 번에 각 결과를 메모리에만 필요로한다. – schmmd

0

짧은 대답 : 번호 Jdom은 XML을 구문 분석하고 데이터 구조로 변환하여 작업을 수행하는 것과 관련되어 있습니다. 이것은 항상 전체 XML을 비 직렬화하는 것을 의미합니다.

+0

어떤 대안을 추천 하시겠습니까? 하위 트리를 구문 분석하기 위해 JDOM과 함께 SAX 핸들러를 사용하는 방법이 있습니까? – schmmd

+0

JDOM이 당신의 요구에 잘 맞는지 알 수 없습니다. 여전히 XML을 사용하고 싶다면 SAX 파서가 XML을 파싱 할 때 필터링 된 JDOM 문서를 만들 수 있다고 생각합니다. – Buhb

+0

하위 요소가 위의 예보다 훨씬 복잡하다는 점을 분명히 설명합니다. – schmmd

2

VTD-XML은 주로 스트림 처리에 사용됩니다. 나는 그것을 광고주의 제품 피드를 읽는 데 사용합니다.

큰 장점은 XPath 만 필요하며 빠른 속도로 XML을 반복 할 수 있으며 매우 작은 메모리 사용 공간 (XML을 반복하는 동안 몇 개의 포인터 만 유지)입니다.

사이트에서 DOM 구문 분석보다 x5-12 배 빠른 성능을 제공하지만 내 경험에 비추어 볼 때 (특히 크기가 100MB 인 경우) x20 속도를 쉽게 얻을 수 있다고합니다.

StAX를 사용 (. javax.xml.stream를 * 구현은 자바 SE 6에 포함되어 있습니다)하지 왜
VTDGen vg = new VTDGen(); 
AutoPilot ap = new AutoPilot(); 
int i; 
ap.selectXPath("/root/element"); 
if (vg.parseFile(FILE_LOCATION,true)){ 
    VTDNav vn = vg.getNav(); 
    ap.bind(vn); // apply XPath to the VTDNav instance 
    // AutoPilot moves the cursor for you 
    while((i=ap.evalXPath())!=-1){ 
     System.out.println("the attribute index val is "+ 
      i +" the attribute string ==>"+vn.toString(vn.getAttrVal("attribute"))); 
    } 
} 
3

에 : 여기

은 VTD-XML을 사용하여 XML을 읽는 방법의 간단한 예입니다 XML에서 스트리밍하고 개별 부분을 객체로 변환 할 수 있습니까?위의 예에서
import java.io.FileReader; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamReader; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Element.class); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 

     XMLInputFactory xif = XMLInputFactory.newFactory(); 
     XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml")); 
     xsr.nextTag(); 
     xsr.nextTag(); 
     while(xsr.hasNext()) { 
      Element element = (Element) unmarshaller.unmarshal(xsr); 
      System.out.println(element.getAttribute()); 
      if(xsr.nextTag() != XMLStreamReader.START_ELEMENT) { 
       break; 
      } 
     } 
    } 

} 

각각의 "요소"

는 (구현은 자바 SE 6에 포함되어있다) JAXB를 이용한 POJO에 비 정렬되지만 적합 보았을 경우 단편을 처리 할 수있다. 아래 JAXB 모델 세부 정보 :

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Element { 

    private String attribute; 

    @XmlAttribute 
    public String getAttribute() { 
     return attribute; 
    } 

    public void setAttribute(String attribute) { 
     this.attribute = attribute; 
    } 

} 

참고 :

StAX를하고 JAXB는 당신은 별도로 구현을 다운로드해야합니다, 또한 자바 SE 5와 호환됩니다.

+1

왜 투표가 다운 되었습니까? –