당신은 다음과 같이 뭔가를 할 수 :
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);
}
}
}
위법은 아니지만 코드가 복잡하게 보입니다. –
@ vtd-xml-author - ContentHandler를 직접 구현하는 대신 DefaultHandler를 확장하도록 코드를 전환 했으므로 코드를 더 쉽게 이해할 수 있습니다. 컨텐트 핸들러를 연결하는 것은 표준 SAX 구문 분석에서 매우 강력한 메커니즘입니다. –
오류입니다.이 코드는 작동하지 않습니다. – Wayne