以下是我对类似问题的答案(使用sax跳过节点)。它演示了如何在XMLReader上交换内容处理程序。
在此示例中,ContentHandler中交换的内容只是忽略所有事件,直到它放弃控制为止,但您可以轻松地调整该概念。
您可以执行以下操作:
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中进行交换,这将吞噬该节点的所有事件。
import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader;public class MyContentHandler implements ContentHandler { private XMLReader xmlReader; public MyContentHandler(XMLReader xmlReader) { this.xmlReader = xmlReader; } public void setdocumentLocator(Locator locator) { } public void startdocument() throws SAXException { } public void enddocument() throws SAXException { } public void startPrefixMapping(String prefix, String uri) throws SAXException { } public void endPrefixMapping(String prefix) throws SAXException { } 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)); } public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { } public void processingInstruction(String target, String data) throws SAXException { } public void skippedEntity(String name) throws SAXException { }}忽略ContentHandler
当IgnoringContentHandler完成吞咽事件后,它将控制权传递回您的主ContentHandler。
import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader;public class IgnoringContentHandler implements ContentHandler { private int depth = 1; private XMLReader xmlReader; private ContentHandler contentHandler; public IgnoringContentHandler(XMLReader xmlReader, ContentHandler contentHandler) { this.contentHandler = contentHandler; this.xmlReader = xmlReader; } public void setdocumentLocator(Locator locator) { } public void startdocument() throws SAXException { } public void enddocument() throws SAXException { } public void startPrefixMapping(String prefix, String uri) throws SAXException { } public void endPrefixMapping(String prefix) throws SAXException { } 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); } } public void characters(char[] ch, int start, int length) throws SAXException { } public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { } public void processingInstruction(String target, String data) throws SAXException { } public void skippedEntity(String name) throws SAXException { }}


