2010-07-28 5 views
4

구문 분석시 노드를 건너 뛸 수 있습니까?이 문자가 skippedEntity과 관련이 있습니까?색소폰을 사용하는 노드 건너 뛰기

이 XML 고려 :

<?xml version="1.0"?> 

<nutrition> 

<daily-values> 
    <total-fat units="g">65</total-fat> 
    <saturated-fat units="g">20</saturated-fat> 
    <cholesterol units="mg">300</cholesterol> 
    <sodium units="mg">2400</sodium> 
    <carb units="g">300</carb> 
    <fiber units="g">25</fiber> 
    <protein units="g">50</protein> 
</daily-values> 

</nutrition> 
내가 건너 뛰려면

"나트륨"요소를

답변

7

당신은 다음과 같이 뭔가를 할 수 :

import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
import org.xml.sax.XMLReader; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser sp = spf.newSAXParser(); 
     XMLReader xr = sp.getXMLReader(); 
     xr.setContentHandler(new MyContentHandler(xr)); 
     xr.parse("input.xml"); 
    } 
} 

MyContentHandler이 클래스가 XML 문서를 처리 할 책임이있다. 무시하려는 노드를 클릭하면 IgnoringContentHandler를 바꿀 수 있습니다. IgnoringContentHandler는 해당 노드의 모든 이벤트를 삼켜 버립니다.

import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 

public class MyContentHandler extends DefaultHandler { 

    private XMLReader xmlReader; 

    public MyContentHandler(XMLReader xmlReader) { 
     this.xmlReader = xmlReader; 
    } 

    public void startElement(String uri, String localName, String qName, 
      Attributes atts) throws SAXException { 
     if ("sodium".equals(qName)) { 
      xmlReader.setContentHandler(new IgnoringContentHandler(xmlReader, 
        this)); 
     } else { 
      System.out.println("START " + qName); 
     } 
    } 

    public void endElement(String uri, String localName, String qName) 
      throws SAXException { 
     System.out.println("END " + qName); 
    } 

    public void characters(char[] ch, int start, int length) 
      throws SAXException { 
     System.out.println(new String(ch, start, length)); 
    } 

} 

IgnoringContentHandler IgnoringContentHandler가 다시 메인의 ContentHandler 제어를 전달 이벤트를 삼키는 완료되면.

import org.xml.sax.Attributes; 
import org.xml.sax.ContentHandler; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 

public class IgnoringContentHandler extends DefaultHandler { 

    private int depth = 1; 
    private XMLReader xmlReader; 
    private ContentHandler contentHandler; 

    public IgnoringContentHandler(XMLReader xmlReader, ContentHandler contentHandler) { 
     this.contentHandler = contentHandler; 
     this.xmlReader = xmlReader; 
    } 

    public void startElement(String uri, String localName, String qName, 
      Attributes atts) throws SAXException { 
     depth++; 
    } 

    public void endElement(String uri, String localName, String qName) 
      throws SAXException { 
     depth--; 
     if(0 == depth) { 
      xmlReader.setContentHandler(contentHandler); 
     } 
    } 

} 
+0

위법은 아니지만 코드가 복잡하게 보입니다. –

+0

@ vtd-xml-author - ContentHandler를 직접 구현하는 대신 DefaultHandler를 확장하도록 코드를 전환 했으므로 코드를 더 쉽게 이해할 수 있습니다. 컨텐트 핸들러를 연결하는 것은 표준 SAX 구문 분석에서 매우 강력한 메커니즘입니다. –

+0

오류입니다.이 코드는 작동하지 않습니다. – Wayne

3

"노드를 건너"에 의해 샘플 XML 및 에 대한 설명을 포함하도록 게시물을 수정하시기 바랍니다 .

파서가 각 이벤트를 제어하므로 원하는 기준에 따라 아무 것도하지 않을 수 있습니다. 전체 하위 트리를 건너 뛰려면 하위 트리의 시작 요소를 만났을 때 전역 플래그를 설정하고 마지막 요소에서 플래그를 지워야합니다. 그런 다음 플래그를 사용하여 포함 된 노드의 처리를 제어하십시오.

+0

xml을 추가 했으므로 "나트륨"원소는 건너 뜁니다. – London

+0

"건너 뛰기"란 무엇을 의미합니까? SAX 파서에서 제어 할 수 있습니다 ... 파싱 이벤트를 손으로 처리하고 원하는 작업을 수행 할 수 있습니다. 모든 태그에 대해 시작 요소 이벤트를 얻고 태그 이름이 "나트륨"이면 데이터를 무시하고 반환하는 로직을 작성할 수 있습니다. 게시물을 수정하고 지금까지 자바에서 시도한 것을 보여줍니다. –

1

불행히도 다른 답변에 대한 의견을 말할 수있는 권한이 없습니다. 나는 블레이즈의 대답이 "효과가 없다"는 잘못된 주장을 바로 잡기를 원했습니다. 나는이 코드를 시도해 보았고 실제로 Sodium을 제외한 예제 데이터의 모든 값을 출력했다. OP가 정확히 무엇을 찾고 있는지 생각한다.