2011-01-31 3 views
3

dom4j를 사용하여 큰 xml 파일을 구문 분석하고 싶습니다. 내가 신경 쓰지 않는 요소를 무시하기 위해 경로 표현식에 대한 이벤트 핸들러를 등록 할 수있는 dom4j의 기능을 사용하고 있습니다. 기능은 여기에서 설명됩니다 : http://dom4j.sourceforge.net/dom4j-1.6.1/faq.html#large-doc.dom4j에서 XML 경로를 지정하십시오.

다음에서 인용 : "이러한 핸들러는 특정 처리기에 등록 된 각 경로의 시작과 끝에서 호출됩니다. 경로의 시작 태그가 발견되면 해당 핸들러의 onStart 메소드가 경로가 끝나면 해당 경로에 등록 된 핸들러의 onEnd 메소드가 호출됩니다.

onStart 및 onEnd 메소드에는 ElementPath 인스턴스가 전달되며,이 인스턴스를 검색하는 데 사용할 수 있습니다 처리기가 메모리 사용을 절약하기 위해 빌드중인 트리를 "제거"하고자하는 경우 핸들러 onEnd() 메서드에서 처리중인 현재 요소의 detach() 메서드를 호출하기 만하면됩니다. "

내 문제는 루트 노드의 모든 자식이 2 가지 방법으로 처리되도록 어떤 경로를 제공해야하는지 모른다는 것입니다.

내 xml 파일은 같은 것입니다 :

내가 경로 것보다 요리사 요소/루트/요리사를 처리하려는 경우

<root .....> 
    <chef name="" ..../> 
    <chef name="" ..../> 
    <recipe name = .... /> 
    <recipe name...../> 
    .... 
. 래서 피 요소의 경우 경로는/root/recipe가됩니다.

하지만 do4j에 제공되어야하는 경로가 (onStart(), onEnd()) chef 및 recipe 요소를 처리 할 수 ​​있도록하려면 어떻게해야합니까?

고맙습니다.

+0

XML 파일은 http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf의 증거입니다. –

답변

1

원하는 깊이 수준에 따라 // root/child :: * 또는 // root/descendant :: *를 시도하십시오.

가용의 XPath에 더 w3schools 참조는 setDefaultHandler()를 호출하고 이런 식을 사용하는 대신 AddHandler에() 메소드를 호출

2

축 :

DOM4J 이상적 큰 적합되지
SAXReader reader = new SAXReader(); 
reader.setDefaultHandler(
new ElementHandler() { 
    public void onStart(ElementPath path) { 
     // If needed, similar to onEnd, but don't detach.  
    } 
    public void onEnd(ElementPath path) { 
     Element parent = path.getCurrent().getParent(); 
     if(parent != null && "/root".equals(parent.getPath()) { 
      // Do whatever 
     } 

     path.getCurrent().detach(); 
    } 
} 
);