`

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

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

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

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


这种用法也是Dom4j所推荐使用的非常简单的方法。
也可以用以下代码来修改保存xml文件:
   
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文档,再次解析打开时会提示类似如下的错误:
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文档,将上面的代码修改如下:

XMLWriter writer = new XMLWriter(new FileOutputStream(file));
    writer.write(doc);
    writer.close();

这样,文件将以utf-8编码格式保存,中文也能正常显示和解析了。
  • 大小: 58.2 KB
分享到:
评论

相关推荐

    dom4j dom4j dom4j dom4j

    在Java世界中,DOM4J是与DOM、SAX和JDOM等其他XML处理库并驾齐驱的一个选择,尤其在处理大型XML文件时,其性能和内存效率往往更胜一筹。 DOM4J的主要特点包括: 1. **丰富的API**:DOM4J提供了大量的接口和类,...

    dom4j 写UTF-8的xml乱码问题 使用FileOutputStream

    标题中的“dom4j 写UTF-8的xml乱码问题 使用FileOutputStream”涉及的是在使用Java编程语言处理XML文件时遇到的编码问题。DOM4J是一个强大的Java库,用于处理XML、XPath和XSLT,它提供了丰富的API来读取、写入、修改...

    dom4j解析xml文件代码示例

    在本示例中,我们将深入探讨如何使用DOM4J解析XML文件,以`CacheInit.java`作为我们的核心代码示例,并参考`emailTemplateConfig.xml`作为实际操作的对象。 首先,让我们了解XML(eXtensible Markup Language)。...

    用dom4j解析xml文件

    创建XML文件时,我们可以使用DOM4J的`DocumentFactory`和`Element`类。首先,创建一个`Document`实例,然后定义根元素,接着添加子元素和属性。例如,创建一个名为`books`的根元素,包含若干`book`子元素,每个`...

    Dom4j解析XML及中文问题

    本文将深入探讨如何使用Dom4j解析XML以及解决中文乱码的问题。 首先,让我们了解Dom4j的基本用法。在解析XML文件时,通常会使用`DocumentBuilderFactory`和`DocumentBuilder`来创建一个`Document`对象,然后通过这...

    java中dom4j读写XML

    DOM4J是基于DOM模型的,但相比标准的Java DOM,它提供了更加简洁和高效的API,使得开发者在处理XML文档时更加方便。 XML(Extensible Markup Language)是一种用于标记数据的语言,广泛应用于网络数据交换、配置...

    dom4j中文彻底解决

    在创建XMLWriter时,直接传递一个Writer对象可能会导致编码问题,因为这可能会忽略或覆盖实际的文件编码设置。因此,我们应该避免直接使用FileWriter,而是选择使用FileOutputStream。 在原始代码中,创建XMLWriter...

    Dom4j读写XML

    以下是对Dom4j读写XML的详细讲解: 一、Document对象相关 1. **读取XML文件**:通过`SAXReader`实例化并调用`read()`方法,可以将XML文件读取为`Document`对象。例如: ```java SAXReader reader = new ...

    dom4j创建xml文件

    ### DOM4J创建XML文件知识点解析 #### 一、DOM4J简介 DOM4J(Document Object Model for XML)是一款Java平台下的轻量级XML处理框架。它提供了一种非常简便的方式来读取、写入以及操作XML文档。相比于SAX和DOM等...

    dom4j以String的方式读取XML的内容,并给String的值赋值,写入XML中

    - 确保处理XML时正确处理编码,避免乱码问题。 - 在修改XML内容时,务必确保找到的节点是存在的,否则会抛出异常。 - `XMLWriter`的输出格式可以根据需求调整,比如去掉空格和换行,或者使用紧凑格式。 DOM4J的...

    eclipse怎么导入dom4j.doc

    然后创建一个Java类,如`XmlTest.java`,使用DOM4J的API来读取和操作XML文件。通过运行这个测试类,你可以检查DOM4J是否能正确解析和访问XML文档的节点内容。 5. **移除DOM4J库**:如果需要从项目中移除DOM4J库,...

    java_dom4j架包

    3. **事件驱动解析**:DOM4J支持SAX和StAX这两种事件驱动的XML解析器,可以在读取大型XML文件时避免内存消耗过大。同时,它也支持DOM解析,虽然DOM解析在处理大型文件时可能效率较低。 4. **XML写作**:DOM4J提供了...

    使用dom4j读写XML文档

    ### 使用dom4j读写XML文档的关键知识点 #### 一、简介与安装 - **DOM4J** 是一款用于处理XML文档的Java库,它提供了简单且强大的API来解析、创建、修改XML文档。 - 官方网站:[http://www.dom4j.org/]...

    dom4j的属性及应用

    1. **XML文件读写**:DOM4J可以方便地读取XML文件,通过Document对象获取整个文档结构,也可以写入XML文件,构建新的XML结构。 ```java File file = new File("example.xml"); Document document = ...

    DOM4J格式化XML

    3. **DOM4J解析XML**:介绍如何使用DOM4J读取XML文件并创建Document对象,解析XML元素和属性。 4. **DOM4J格式化API**:详述DOM4J库中用于格式化XML的类和方法,如`DocumentHelper.formatDocument()`或`Element....

    dom4j解析XML文件格式

    DOM4j支持DOM、SAX、JAXP等多种XML解析方式,并内置了对XPath的支持,这使得开发人员能够轻松地进行XML文件的读取、写入以及查询等操作。 **环境搭建:** 1. **下载DOM4j库:** - 前往DOM4j官方网站或其他可信源...

    dom4j jaxen jar包

    6. **读写XML**:DOM4J可以轻松地读取XML文件,进行修改后保存回磁盘,或者生成新的XML文件。 7. **性能优化**:DOM4J设计时考虑了性能,相比纯DOM解析,DOM4J在内存使用和处理速度上有优势。 **JAXEN库** JAXEN...

    DOM4J

    在实际开发中,DOM4J常用于XML配置文件的读写、XML数据的交换、XML格式的Web服务等场景。由于其易用性和灵活性,DOM4J成为了Java世界中处理XML的首选工具之一。结合Jaxen,开发者能够充分利用XPath的强大功能,高效...

    XML解析技术DOM4J解析

    DOM4J提供了通过其API和标准DOM接口并行访问文档的能力,这意味着开发者可以在不同线程中安全地读取和修改XML文档,增强了多线程环境下程序的并发性能。 **5. 高度可定制的API** 尽管DOM4J的API相对复杂,但它提供...

    dom4j

    此外,通过设置正确的字符集编码,可以避免中文乱码的问题。以下是格式化XML文档的相关代码: ```java // 使用SAXReader读取XML文件 SAXReader saxReader = new SAXReader(); Document document = saxReader.read...

Global site tag (gtag.js) - Google Analytics