Vous pouvez faire quelque chose comme ce qui suit:
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
Cette classe est responsable du traitement de votre document XML. Lorsque vous frappez un nœud que vous voulez ignorer, vous pouvez permuter dans IgnoringContentHandler qui va avaler tous les événements pour ce nœud.
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
Lorsque le IgnoringContentHandler est fait des événements avaler passe le contrôle à votre ContentHandler principale.
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);
}
}
}
pas d'infraction, mais le code semble terriblement complexe pour moi .. –
@ vtd-xml-author - J'ai changé le code pour étendre DefaultHandler plutôt que d'implémenter ContentHandler directement, cela devrait rendre le code plus facile à comprendre. Le chaînage de gestionnaires de contenu est un mécanisme très puissant dans l'analyse syntaxique SAX standard. –
erreur, ce code ne fonctionne pas. – Wayne