使用dom4j解析xml文件

org.dom4j.io包提供了两个类:SAXReader和DOMReader, DOMReader只能从一个现有的W3C DOM树中构建dom4j树,即只能从一个org.w3c.dom.Document中构建org.dom4j.Document 树, 而SAXReader则使用SAX解析器,从不同的输入源构建dom4j树,如可以从xml文件中读取并构建dom4j树。下面将分别介绍这两种方式:

org.dom4j.io包提供了两个类:SAXReader和DOMReader, DOMReader只能从一个现有的W3C DOM树中构建dom4j树,即只能从一个org.w3c.dom.Document中构建org.dom4j.Document 树, 而SAXReader则使用SAX解析器,从不同的输入源构建dom4j树,如可以从xml文件中读取并构建dom4j树。下面将分别介绍这两种方式:

XML文档如下(books.xml)

<?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方式

使用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方式

使用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();
		}
	}
}

在这里两种方式就介绍完了,具体使用哪种方式根据自己的喜好和项目实际需要酌情考虑,谢谢支持!!!

学习从来无捷径,循序渐进登高峰。 —— 高永祚
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号