用sax跳过节点

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

考虑以下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>

我想跳过“钠”元素

回答:

您可以执行以下操作:

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

}

}

忽略ContentHandler

当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);

}

}

}

以上是 用sax跳过节点 的全部内容, 来源链接: utcz.com/qa/398714.html

回到顶部