2017-05-08 13 views
0

Java 응용 프로그램에서 사용자 지정 XML 구성 파일을 구문 분석하고 있습니다. 주로 라인 번호가있는 구성에서 오류를보고해야하기 때문에 SAX 파서를 사용하려고합니다.Java에서 SAX 구문 분석의 요소 내용 건너 뛰기

가 온라인 핸들러 클래스를 구현, 사물이 정상 처리를 위해 매우 간단 보일의 코드 샘플 많이 있습니다 - 예를 들어이

하지만 내 경우에는 http://tutorials.jenkov.com/java-xml/sax-example.html, 때로는 내가 아래에 전체 트리를 건너 뛸 필요 요소 :

<sampledocument> 
    <sampletag> 
     <process/> 
     <these/> 
     <tags/> 
    </sampletag> 
    <sampletag skip="yes"> 
     <do_not> 
     <process/> 
     <these/> 
     <tags/> 
    </sampletag> 
<sampledocument> 

추가 추가 : 또한 런타임시 건너 뛸지 여부 만 알 수 있습니다. 다소 인위적인 예제에서는 <sampletag>에서 태그를 처리하기 위해 파일을 열 필요하고, 파일을 찾을 수없는 경우,이를 처리하지 : 물론

<sampledocument> 
    <sampletag file="file1"> 
     <process/> 
     <these/> 
     <tags/> 
     <if_file1_exists/> 
    </sampletag> 
    <sampletag file="file2"> 
     <process/> 
     <these/> 
     <tags/> 
     <if_file2_exists/> 
    </sampletag> 
<sampledocument> 

, 방금 핸들러에 건너 뛰는 추적 할 수 있습니다 코드,하지만 이것은 조금 어색합니다. 어떻게 든이 요소의 내용을 건너 뛰기 위해 startElement() 메서드에서 SAX를 말할 수 있습니까?

답변

1

SAX 파서와 기존 ContentHandler 사이의 파이프 라인에 앉아 필터 클래스를 작성하십시오. XMLFilterImpl을 확장하면됩니다. 이 필터는 처음에는 0 인 skipDepth 정수 변수를 가져야합니다.

startElement에서 딥 스킵하려는 요소를 인식하거나 skipDepth> 0 인 경우 skipDepth가 증가합니다.

endElement에서 skipDepth> 0이면 skipDepth를 감소시킵니다.

모든 이벤트 핸들러에서

(super.xxx()를 호출하여) 파이프 라인 아래에 이벤트를 전달하면 당신이 현명하게하려면 skipDepth의 == 0

,이 필터를 작성할 수있는 경우에만 일반적인 방식으로, 노드 이름과 속성을 받아들이는 콜백 함수 인 매개 변수를 취하고 요소를 건너 뛸지 여부를 나타내는 부울을 반환합니다. 다음 번에 요소를 건너 뛰고 다른 건너 뛰기 조건을 사용하여 코드를 재사용 할 수 있습니다.

+0

감사! 그러나 ContentHandler에서 단순히 skipDepth를 유지하는 것과 다른 점은 무엇입니까? 내 실제 작업에서 ContentHandler는 실제로 트리를 건너 뛸지 여부를 결정하기 전에 요소를 처리해야하므로 별도의 필터가 있으면 ContentHandler가 건너 뛸 수 있도록해야합니다. –

+0

SAX 코드는 항상 파이프 라인으로 작성하는 것이 가장 좋습니다. 하나의 단계는 각 분리 가능한 작업마다 파이프 라인에 작성됩니다. 그렇지 않으면 ContentHandler에 스파게티 코드가 생기게됩니다 (이미 "조금 어색했다"). 제대로 구축 된 파이프 라인을 사용하면 유지 보수가 가능하고 재사용이 가능한 코드를 쉽게 수정하고 디버깅 할 수 있습니다. ContentHandler에 모든 것을 넣으면 유지 보수가 불가능 해집니다. 물론, 당신의 예제가 실제 태스크와 다른 경우 실제 태스크에서 기능을 분해하는 방법을 조언 할 수는 없습니다. –

+0

런타임에 파일을 테스트하기 위해 예제를 수정했습니다. 실제 코드는 구성의 정확성을 확인하고 매우 오랜 질문을하는 방식을 설명하지만 별도의 클래스에 대한 호출이므로 파일을 확인하는 것과 다소 비슷합니다. –