问题描述
DOM4J对XML文档进行增删改查后,将内存中的Document对象保存到持久化设备生成XML文件后,XML文件无法正常打开,出现乱码。也有可能会报异常:
Xml:org.dom4j.DocumentException: 2字节的UTF-8序列的2无效
产生乱码原因
- 表面原因:因为XML文件的真正格式(即XML文件保存在持久化设备上的编码格式)和XML文档声明的encoding属性值不一致;
- 深层原因:一个没有问题的XML文件(XML文件的真正的编码格式和encoding属性值一致),DOM4J API都可以把这个XML文件正常解析成一个Document对象。不管这个XML文件在读入内存之前是什么编码格式,在内存中形成的Document对象都是UTF-8格式,并且encoding属性值也相应的变成UTF-8。造成XML文件的真正格式和encoding属性值不一致的情况发生在把Document对象写入持久化设备时字符到字节的转换过程或字符流直接存储过程。
乱码原因分析
我试着举例去分析乱码的原因,假设XML文档的编码模式是UTF-8(即encoding=“UTF-8”),比如有这样一个book.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>109元</售价>
</书>
<书>
<书名 name="xxxx">JavaScript网页开发</书名>
<作者>黎活明</作者>
<售价>28.00元</售价>
</书>
</书架>
当我们在第一本书中添加一个新的售价,比如<售价>209元</售价>
。使用DOM4J API将内存中的Document对象写入到XML文件中,代码如下:
package cn.liayun.dom4j;
import java.io.File;
import java.io.FileWriter;
import org.dom4j.Document