Skipping nodes with sax

Is it possible to skip nodes during parsing and how does skippedEntity do this?

Consider this 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> 

I want to skip the sodium element

+4
java xml sax
source share
3 answers

You can do something like the following:

 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

This class is responsible for processing your XML document. When you click on the node you want to ignore, you can swap the IgnoringContentHandler, which will swallow all the events for that node.

 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

When the IgnoringContentHandler swallows events, it transfers control to your primary 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); } } } 
+7
source share

Modify your message to include a sample XML and description of what you mean by "skip nodes".

As your parser takes control of each event, you can do nothing based on whatever criteria you want. If you want to skip the whole subtree, you need to set a global flag when you meet the start subtree element and clear the flag at the end of the element; then use the flag to control the processing of contained nodes.

+3
source share

Unfortunately, I have no right to comment on other answers. I just wanted to correct Wayne’s incorrect statement that Blaise says β€œdoesn't work.” I tried this code, and it really deduces all the values ​​from the example data, except for sodium - which, I think, is exactly what the OP is looking for.

+1
source share

All Articles