今天由于项目需要,在网上搜索了关于XML解析的框架,发现Dom4j使用的比较多、性能好。于是就尝试着去学习一下,但是在学习使用dom4j解析XML文档时,如果XML文档中没有中文,则解析正常。存在中文则会出现中文乱码,下面是解决思路,贴出来供大家参考。
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>
可以看出XML文档的编码为UTF-8,并且使用eclipse创建的工程也是UTF-8。
Java文件如下:
package com.bug315.parse; import java.io.File; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.dom4j.Element; import org.dom4j.io.DOMReader; /** * 使用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 File("document/books.xml")); // 使用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(); } } }
细心的读者可能会发现,我们直接使用的File方式来读取XML文件,
org.w3c.dom.Document document = db.parse(new File("document/books.xml"));
这样会存在一个问题,我们不能明确指定使用何种编码来读取XML文件,因此我们需要寻找一种能够指定编码的读取的方式来加载XML文档,如下:
new InputSource( new BufferedReader( new InputStreamReader( new FileInputStream("document/books.xml"), "UTF-8") ) );
这里使用InputStreamReader指定使用UTF-8的方式来读取XML文档,然后再将InputStreamReader传给BufferedReader类,紧接着使用BufferedReader来创建一个InputSource对象,使用该对象来创建Document对象。完整如下:
// 使用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"))) );
到这里再次运行,中文乱码就解决了。
总结,在把字节流转化成字符流(FileInputStream变成InputStreamReader)的过程中对于TXT文本貌似是没有影响的,因为我在处理文本文件时,从来没有指定过编码方式,但utf-8下的xml文件需要指定编码方式避免中文乱码;另外,InputSource 对于字节流和字符流的不同处理方式。