标签:
public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //dbf.setNamespaceAware(true); //dbf.setValidating(true); DocumentBuilder db = dbf.newDocumentBuilder(); OutputStreamWriter errorWriter = new OutputStreamWriter(System.err, "UTF-8"); db.setErrorHandler(new MyErrorHandler( new PrintWriter(errorWriter, true))); Document doc = db.parse(new File("resources/dom_example.xml")); doc.getDocumentElement().normalize(); Element node = doc.getDocumentElement(); traverse(node, 0); } private static void traverse(Node node, int deep) { if (null == node) { return; } Node sibling = node; while (null != sibling && Node.ELEMENT_NODE == sibling.getNodeType()) { printNode(node, deep); traverse(sibling.getFirstChild(), deep + 1); sibling = node.getNextSibling(); } }
除了JDK自己的dom实现外,常用的dom库有DOM4J。
既然是Push parsing,我们需要实现Handler来(ContentHandler, ErrorHandler, DTDHandler, etc.)对获取的事件进行处理。通常我们继承DefaultHandler。
SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware(true); SAXParser saxParser = spf.newSAXParser(); XMLReader xmlReader = saxParser.getXMLReader(); xmlReader.setContentHandler(new SAXLocalNameCount()); xmlReader.setErrorHandler(new MyErrorHandler(System.err)); xmlReader.parse("sax_example.xml");
DOM和SAX都是1.6之前的api,因此,最好不要再使用。
从1.6开始,为了提高效率,提供了几种新的api用于处理xml:
Stax API分为Cursor API和Event Iterator API。
Cursor API提供一个前向Cursor遍历xml。主要包括2个接口:
XMLStreamReader:
XMLStreamWriter:
Event Iterator API将xml流看成事件对象。解析器(Parser)通过pull方式获取事件。主要包括以下接口:
XMLEvent
XMLEventReader
XMLEventWriter
Event Iterator API与Cursor API相比较而言有以下优点:
如果内存受限或是要求高performance,优先选择Cursor API;其他情况下尽量使用Event Iterator API。
XMLInputFactory用于创建xml流读取。XMLInputFactory.newInstance按照以下步骤决定XMLInputFactory实例:
XMLOutputFactory用于创建xml流写入。
XMLEventFactory用于创建事件。
XMLStreamReader:
XMLInputFactory f = XMLInputFactory.newInstance(); XMLStreamReader r = f.createXMLStreamReader( ... ); while(r.hasNext()) { r.next(); }
XMLEventReader:
XMLStreamWriter:
XMLEventWriter:
报告CDATA Event:javax.xml.stream.XMLStreamReader 默认不报告CDATA事件。如果需要的话,可以按以下配置XMLInputFactory:
XMLInputFactory factory = XMLInptuFactory.newInstance();
factory.setProperty("report-cdata-event", Boolean.TRUE);
具体例子可以参考:http://docs.oracle.com/javase/tutorial/jaxp/stax/example.html
关于Stax和其他Xml api的对比可以参照http://docs.oracle.com/javase/tutorial/jaxp/stax/why.html
标签:
原文地址:http://www.cnblogs.com/liuzhijielzj/p/4820188.html