【转】用Dom4j读写文件时的中文编码问题

本文介绍了使用Dom4j处理XML文件的方法,包括如何加载XML文档到内存、修改和保存XML文件等内容,并针对中文字符处理提供了编码解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Dom4j是一个比较优秀的java开源xml解析项目,支持DOM, SAX and JAXP.,并提供对XPath查询语言的强大支持。因此,在EasyJF团队的很多开源项目中,如EasyJWeb、EasyDBO等都是使用 Dom4j来处理xml文件相关操作。
1、从一个xml文件中载入一个Dom到内存:
  
Java代码 复制代码
  1. FileInputStream in = new FileInputStream(new File(fileName));   
  2.   SAXReader reader = new SAXReader();   
  3.   doc = reader.read(in);  
FileInputStream in = new FileInputStream(new File(fileName));
  SAXReader reader = new SAXReader();
  doc = reader.read(in);

2、把Dom中的数据写入到xml文件中
  使用 Dom4j,要把一个Dom中的数据写入到文件非常简单,API如下:
  
Java代码 复制代码
  1. public void write(Writer writer) throws IOException;  
public void write(Writer writer) throws IOException;

  因此,假如我们要把一个Document写入到c:/test.xml文件中,可以简单的使用下面的代码即可:
   
Java代码 复制代码
  1. java.io.Writer wr= new java.io.FileWrite(filename);   
  2.   doc.write(wr);   
  3.     wr.close();//注意,必须要执行close()方法,才会实现真正的写入  
java.io.Writer wr= new java.io.FileWrite(filename);
  doc.write(wr);
    wr.close();//注意,必须要执行close()方法,才会实现真正的写入


这种用法也是 Dom4j所推荐使用的非常简单的方法。
也可以用以下代码来修改保存xml文件:
   
Java代码 复制代码
  1. File file = new File("D:/Workspaces for MyEclipse 7.1/test/src/com/config/DemoPkgrptb.xml");   
  2.     SAXReader reader = new SAXReader();   
  3.     Document doc = reader.read(file);   
  4.     List list;   
  5.     Iterator itr;   
  6.                 /*  
  7.                  * 设置汇总表  
  8.                  */  
  9.     list = doc.selectNodes("//Parameter[@Name='Query']");   
  10.     itr = list.iterator();   
  11.     while(itr.hasNext()){   
  12.           Element elt = (Element) itr.next();   
  13.           elt.attribute("Value").setValue(etlSumTable);   
  14.     }   
  15.        
  16.     XMLWriter writer = new XMLWriter(new FileWriter(file));   
  17.     writer.write(doc);   
  18.     writer.close();  
File file = new File("D:/Workspaces for MyEclipse 7.1/test/src/com/config/DemoPkgrptb.xml");
    SAXReader reader = new SAXReader();
    Document doc = reader.read(file);
    List list;
    Iterator itr;
                /*
                 * 设置汇总表
                 */
    list = doc.selectNodes("//Parameter[@Name='Query']");
    itr = list.iterator();
    while(itr.hasNext()){
          Element elt = (Element) itr.next();
          elt.attribute("Value").setValue(etlSumTable);
    }
    
    XMLWriter writer = new XMLWriter(new FileWriter(file));
    writer.write(doc);
    writer.close();

然而,当文件中包含有中文字符数据的时候,这种方法生成或保存过的xml文档,再次解析打开时会提示类似如下的错误:
Java代码 复制代码
  1. org.dom4j.DocumentException: invalid byte 1 of 1-byte UTF-8 sequence (0xb2) Nested exception: invalid byte 1 of 1-byte UTF-8 sequence (0xb2)   
  2.  at org.dom4j.io.SAXReader.read(SAXReader.java:484)   
  3.  at org.dom4j.io.SAXReader.read(SAXReader.java:343)  
org.dom4j.DocumentException: invalid byte 1 of 1-byte UTF-8 sequence (0xb2) Nested exception: invalid byte 1 of 1-byte UTF-8 sequence (0xb2)
 at org.dom4j.io.SAXReader.read(SAXReader.java:484)
 at org.dom4j.io.SAXReader.read(SAXReader.java:343)
原因分析:
用FileWriter默认的输出编码是与操作系统默认文件编码一致,在中文widows中是ANSI编码,java中由Writer类继承下来的子类没有提供编码格式处理,而 Dom4j中的wirte方法(例如,API方法:write(Document doc))默认是以utf-8格式来保存的,因此文件中的内容是utf-8编码格式,而文件本身却是以ANSI编码保存的。当在myeclipse中打开xml文件时,xml中的中文字符就显示为乱码,当再次运行程序做xml文件修改操作时,解析就出错,出现上面的错误提示。

出现上面的编码问题是因为使用了org. dom4j.io.XMLWriter的构造函数:XMLWriter(Writer writer) ,真正元凶是构造函数的参数Writer类的子类(如:FileWriter)不提供编码格式处理,将文件保存为何系统一致的ANSI编码。

解决方法:
通过org. dom4j.io.XMLWriter的构造函数:XMLWriter(OutputStream out) 来构建xml文档,将上面的代码修改如下:

Java代码 复制代码
  1. XMLWriter writer = new XMLWriter(new FileOutputStream(file));   
  2.     writer.write(doc);   
  3.     writer.close();  
XMLWriter writer = new XMLWriter(new FileOutputStream(file));
    writer.write(doc);
    writer.close();

这样,文件将以utf-8编码格式保存,中文也能正常显示和解析了。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值