使用sax跳过节点

是否有可能在解析时跳过节点以及这个skippedEntity与它有什么关系?

考虑这个XML:

    65 20 300 2400 300 25 50   

我想跳过“钠”元素

您可以执行以下操作:

 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.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); } } } 

请编辑您的post以包含示例XML以及“跳过节点”的含义说明。

由于您的解析器可以控制每个事件,因此您可以根据所需的任何条件选择不执行任何操作。 如果要跳过整个子树,则必须在遇到子树的start元素时设置全局标志并清除end元素的标志; 然后使用该标志来控制所包含节点的处理。

不幸的是,我没有权利评论其他答案。 我只是想纠正“韦恩”错误断言布莱斯的回答“不起作用”。 我已经尝试过这个代码,它确实输出了示例数据中的所有值,除了Sodium之外 – 我认为这正是OP所寻求的。