org.dom4j.io包提供了两个类:SAXReader和DOMReader, DOMReader只能从一个现有的W3C DOM树中构建dom4j树,即只能从一个org.w3c.dom.Document中构建org.dom4j.Document 树, 而SAXReader则使用SAX解析器,从不同的输入源构建dom4j树,如可以从xml文件中读取并构建dom4j树。下面将分别介绍这两种方式:
<?xml version="1.0" encoding="GB2312"?> <books> <!-- java圣经 --> <book isbn="9787111213826"> <name>《Java编程思想(第4版)》</name> <desc> <![CDATA[Java 《Java编程思想(第4版)》书共22章,包括操作符、控制执行流程、访问权限控制]]> </desc> </book> <!-- Core Java Volume I-Fundamentals(Ninth Edition) 分为上下两卷 --> <book isbn="9787111445142"> <name>Java核心技术</name> <desc> <![CDATA[Java领域最有影响力和价值的著作之一,与《Java编程思想》齐名,10余年全球畅销不衰,广受好评;]]> </desc> </book> </books>
使用SAXReader方式解析XML文档非常方便,需要两三行代码就可以创建一个Document对象,同时也提供了很多方式去加载XML文档,首先new一个SAXReader对象,然后使用read去加载XML文档,如下:
package com.bug315.parse; import java.io.File; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * 使用Dom4j的SAXReader解析XML文档 * * @author administrator * @date 2015年12月17日20:48:46 */ public class ParseElementTest01 { public static void main(String[] args) throws Exception { // 使用SAXReader获取Document对象 SAXReader saxReader = new SAXReader(); saxReader.setEncoding("UTF-8"); Document document = saxReader.read(new File("document/books.xml")); // 获取根节点对象 Element root = document.getRootElement(); System.out.println( "<" + root.getName() + ">" ); /** * 获取<books>标签下面的所有<book>标签 */ List subElements = root.elements("book"); for (Object subObj : subElements ) { Element temp = (Element)subObj; System.out.println( "<" + temp.getName() + " isbn=\"" + temp.attributeValue("isbn") + "\">"); Element name = temp.element("name"); System.out.println( "<name> " + name.getText().trim() ); Element desc = temp.element("desc"); System.out.println( "<desc> " + desc.getText().trim() ); System.out.println(); } } }
使用DOMReader方式个人感觉没有SAXReader方便,而且需要很多行代码,而且在解决中文乱码问题的时候你需要写一大堆的Java IO代码,什么BufferedReader、InputStreamReader、等。而且DOMReader方式是在W3C的Document对象上创建的DOM树,创建W3C的Document对象需要一大串的代码量,如下:
package com.bug315.parse; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.dom4j.Element; import org.dom4j.io.DOMReader; import org.xml.sax.InputSource; /** * 使用DOMReader创建Document对象 * * @author administrator * @date 2015年12月17日21:25:48 */ public class ParseElementTest02 { public static void main(String[] args) throws Exception { // 使用java自带的W3C DOM形式创建Document对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); org.w3c.dom.Document document = db.parse( new InputSource(new BufferedReader( new InputStreamReader(new FileInputStream("document/books.xml"), "UTF-8"))) ); File f = new File("document/books.xml"); System.out.println( f.toURI().toASCIIString() ); // 使用Dom4j的DOMReader的read方法根据org.w3c.dom.Document创建Document DOMReader reader = new DOMReader(); org.dom4j.Document dom = reader.read(document); Element root = dom.getRootElement(); System.out.println( root.getName() ); List eleList = root.elements("book"); for ( Object obj : eleList ) { Element temp = (Element)obj; System.out.print( temp.getName() ); System.out.println( " isbn = " + temp.attributeValue("isbn") ); Element name = temp.element("name"); System.out.println( name.getName() + " " + name.getText() ); Element desc = temp.element("desc"); System.out.println( desc.getName() + " " + desc.getName() ); System.out.println(); } } }
在这里两种方式就介绍完了,具体使用哪种方式根据自己的喜好和项目实际需要酌情考虑,谢谢支持!!!