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();
}
}
}在这里两种方式就介绍完了,具体使用哪种方式根据自己的喜好和项目实际需要酌情考虑,谢谢支持!!!