这几天开始学习dom4j,在网上找了篇文章就开干了,上手非常的快,但是发现了个问题就是无法以UTF-8保存xml文件,保存后再次读出的时候会报 “Invalid byte 2 of 2-byte UTF-8 sequence.”这样一个错误,检查发现由dom4j生成的这个文件,在使用可正确处理XML编码的任何的编辑器中中文成乱码,从记事本查看并不会出现乱码会正确显示中文。让我很是头痛。试着使用GBK、gb2312编码来生成的xml文件却可以正常的被解析。因此怀疑的dom4j没有对utf-8编码进行处理。便开始查看dom4j的原代码。终于发现的问题所在,是自己程序的问题。在dom4j的范例和网上流行的《DOM4J 使用简介》这篇教程中新建一个xml文档的代码都类似如下:
public void createXML(String fileName) {
Document doc = org.dom4j.DocumentHelper.createDocument();
Element root = doc.addElement("book");
root.addAttribute("name", "我的图书");
Element childTmp;
childTmp = root.addElement("price");
childTmp.setText("21.22");
Element writer = root.addElement("author");
writer.setText("李四");
writer.addAttribute("ID", "001");
try {
org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(
new FileWriter(fileName));
xmlWriter.write(doc);
xmlWriter.close();
}catch (Exception e) {
System.out.println(e);
}
}
在上面的代码中输出使用的是FileWriter对象进行文件的输出。这就是不能正确进行文件编码的原因所在,java中由Writer类继承下来的子类没有提供编码格式处理,所以dom4j也就无法对输出的文件进行正确的格式处理。这时候所保存的文件会以系统的默认编码对文件进行保存,在中文版的 window下java的默认的编码为GBK,也就是所虽然我们标识了要将xml保存为utf-8格式但实际上文件是以GBK格式来保存的,所以这也就是为什么能够我们使用GBK、GB2312编码来生成xml文件能正确的被解析,而以UTF-8格式生成的文件不能被xml解析器所解析的原因。好了现在我们找到了原因所在了,我们来找解决办法吧。首先我们看看dom4j是如何实现编码处理的
public XMLWriter(OutputStream out) throws UnsupportedEncodingException {
//System.out.println("In OutputStream");
this.format = DEFAULT_FORMAT;
this.writer = createWriter(out, format.getEncoding());
this.autoFlush = true;
namespaceStack.push(Namespace.NO_NAMESPACE);
}
public XMLWriter(OutputStream out, OutputFormat format) throws UnsupportedEncodingException {
//System.out.println("In OutputStream,OutputFormat");
this.format = format;
this.writer = createWriter(out, format.getEncoding());
this.autoFlush = true;
namespaceStack.push(Namespace.NO_NAMESPACE);
}
/**
* Get an OutputStreamWriter, use preferred encoding.
*/
protected Writer createWriter(OutputStream outStream, String encoding) throws UnsupportedEncodingException {
return new BufferedWriter(
new OutputStreamWriter( outStream, encoding )
);
}
由上面的代码我们可以看出dom4j对编码并没有进行什么很复杂的处理,完全通过java本身的功能来完成。所以我们在使用dom4j的来生成我们的 XML文件时不应该直接为在构建XMLWriter时,不应该直接为其赋一个Writer对象,而应该通过一个OutputStream的子类对象来构建。也就是说在我们上面的代码中,不应该用FileWriter对象来构建xml文档,而应该使用FileOutputStream对象来构建所以将代码修改入下:
public void createXML(String fileName) {
Document doc = org.dom4j.DocumentHelper.createDocument();
Element root = doc.addElement("book");
root.addAttribute("name", "我的图书");
Element childTmp;
childTmp = root.addElement("price");
childTmp.setText("21.22");
Element writer = root.addElement("author");
writer.setText("李四");
writer.addAttribute("ID", "001");
try {
//注意这里的修改
org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(
new FileOutputStream(fileName));
xmlWriter.write(doc);
xmlWriter.close();
}
catch (Exception e) {
System.out.println(e);
}
}
至此DOM4J的问题编码问题算是告一段落,希望对此文章对其他朋友有用。
分享到:
相关推荐
7. **XML编解码**:DOM4J提供了XML编码和解码的功能,可以将Java对象序列化为XML,也可以将XML反序列化为Java对象。 8. **性能优化**:DOM4J在设计上考虑了性能优化,通过高效的数据结构和算法,减少了不必要的内存...
【DOM4J编码问题彻底解决】 DOM4J是一个流行的Java XML API,它提供了灵活和强大的方式来处理XML文档。在处理XML文档时,编码问题是一个常见的挑战,特别是当涉及到读取、写入或转换XML文件时。本文主要讨论了如何...
Dom4J 输出 XML 时中文乱码解决方案 Dom4J 是一个流行的 Java 库,用于解析和生成 XML 文档。然而,在使用 Dom4J 输出 XML 文档时,中文字符可能会出现乱码问题。这是因为 Dom4J 的默认编码方式可能不支持中文字符...
本文将深入探讨如何使用Dom4j解析XML以及解决中文乱码的问题。 首先,让我们了解Dom4j的基本用法。在解析XML文件时,通常会使用`DocumentBuilderFactory`和`DocumentBuilder`来创建一个`Document`对象,然后通过这...
此包有以下资源: dom4j API DOM4J 使用简介 dom4j(Version 1[1].6.1)快速入门 Matrix - 与 Java 共舞 - Dom4j 编码问题彻底解决 使用 dom4j 解析 XML
常见的 XML 解析器有 DOM、SAX、JDOM 和 DOM4J 等。每种解析器都有其特点和优缺,选择合适的解析器对应用程序的性能和开发效率有很大影响。 1. DOM 解析器 DOM(Document Object Model)是 W3C 官方标准,用于表示...
标题中的“dom4j 写UTF-8的xml乱码问题 使用FileOutputStream”涉及的是在使用Java编程语言处理XML文件时遇到的编码问题。DOM4J是一个强大的Java库,用于处理XML、XPath和XSLT,它提供了丰富的API来读取、写入、修改...
Java DOM4J是一个轻量级、高性能且功能丰富的XML处理库,它提供了全面的XML解决方案,包括解析、生成、操作和转换XML文档。DOM4J是基于Java API的,其名称中的“DOM”指的是文档对象模型(Document Object Model),...
- **XML编码和解码**:DOM4J提供了将XML对象编码为字符串和从字符串解码回XML对象的功能。 DOM4J因其易用性、高性能和丰富的功能而受到广泛欢迎,它是许多Java开发者处理XML文档的首选库。无论你是进行XML解析、...
- `DocumentWriter` 和 `XMLWriter` 类用于将 DOM4J 对象转换为字符串或写入输出流,支持自定义编码和格式化选项。 8. **DOM4J 与 JDOM、JAXB 等其他 XML 库的对比** - DOM4J 相对于 JDOM 提供了更丰富的功能和更...
6. **XML编码与解码**:DOM4J提供了XML编码和解码的功能,使得XML数据可以在网络传输或存储时进行序列化和反序列化。 总的来说,DOM4J是Java开发中处理XML文档的强大工具,它的灵活性、易用性以及高性能使其在各种...
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活且高效的API,使得XML的解析、创建、修改和查询变得简单。在本示例中,我们将深入探讨如何使用DOM4J解析XML文件,以`CacheInit.java`作为我们的核心代码...
DOM4J大量利用了Java Collections框架,同时提供了一些性能优化的替代方法,以实现更好的性能或更直观的编码风格。 #### 开发与使用 DOM4J的开发目标与JDOM相似,即提供易于使用且直观的操作体验,但DOM4J更进一步...
【标题】"DOM4J格式化XML"是一个关于XML处理的专题,主要聚焦于使用DOM4J库对XML文档进行格式化的技术。DOM4J是一个非常流行的Java XML API,它提供了丰富的功能,包括读取、写入、修改以及操作XML文档。在XML处理中...
DOM4J和JAXEN是两个在Java编程中处理XML文档的重要库,它们通常一起使用以实现更灵活和高效的XML操作。在这个场景中,我们讨论的是包含这两个库的jar包,即`dom4j.jar`和`jaxen.jar`。 **DOM4J库** DOM4J是一个非常...
7. **XML编解码**:DOM4J提供了对XML编码和解码的支持,可以将XML对象序列化为字符串,或者从字符串反序列化为XML对象。 8. **XPath扩展**:Jaxen支持XPath函数库,包括标准函数以及自定义函数,使查询能力更加强大...
### DOM4J创建XML文件知识点解析 #### 一、DOM4J简介 DOM4J(Document Object Model for XML)是一款Java平台下的轻量级XML处理框架。它提供了一种非常简便的方式来读取、写入以及操作XML文档。相比于SAX和DOM等...
Java中的DOM4J库是一个非常流行的、开源的Java XML API,它提供了强大的XML处理功能,包括XML的读取、创建、修改以及写入。DOM4J是基于DOM模型的,但相比标准的Java DOM,它提供了更加简洁和高效的API,使得开发者在...
此外,通过设置正确的字符集编码,可以避免中文乱码的问题。以下是格式化XML文档的相关代码: ```java // 使用SAXReader读取XML文件 SAXReader saxReader = new SAXReader(); Document document = saxReader.read...