网上有很多介绍dom4j的使用的文章,包括官方自己的举例。但是在写或者修改xml文件时,如果直接按教程方法写,就会遭遇编码问题,往往会报遇到不可
识别的符号的错误。而在windows系统下,用记事本打开可能看起来很正常似的,比如看到xml编码标签那写的<?xml
version="1.0"
encoding="UTF-8"?>这样的格式。细心的人用EditPlus打开,就会发现编码实际上并非utf-8,可能是gbk。
我们来看写文件时用到的XMLWriter,他提供以下几种构造方法:
XMLWriter
()
|
XMLWriter
(OutputFormat format)
|
XMLWriter
(OutputStream out)
|
XMLWriter
(OutputStream out,
OutputFormat format)
|
XMLWriter
(Writer writer)
|
XMLWriter
(Writer writer,
OutputFormat format)
|
最简单常用的可能是new
XMLWriter(new
FileWriter(...))这样的形式。可如果你一旦这么用,就会造成编码问题。由于dom4j对于文件编码的选择是才用java本身类的处理方式
(可以从源码看到),这么写就是采用FileWriter的处理方式,而FileWriter是不提供对编码的处理的。于是会调用系统自身的编码,比如用
中文操作系统,编码方式就是gbk,然后默认的,他赫然会在文件头写上<?xml
version="1.0"
encoding="UTF-8"?>。也就是说,他以当前操作系统的编码保存文件,并且竟然自动添加文件头为"utf-8"格式,这会导致很多程
序无法读取正确编码,而且具有很差的移植性(比如在windows下开发,放到linux服务器下跑,毕竟一般linux服务器默认local都是
utf-8)。
解决途径一:使用new XMLWriter(new
FileOutputStream(...))方法。这样做,因为dom4j默认使用utf-8编码,即xml文件头默认编码方式,并且内容也会使用utf-8保存,这样可以做到一致的编码,不会出问题。
解决途径二:使用new XMLWriter(new
FileOutputStream(...), outputFormat)的构造方法。
OutputFormat xmlFormat =
OutputFormat.createPrettyPrint();
xmlFormat.setEncoding("utf-8");
XmLWriter writer = new XMLWriter(new
FileOutputStream(...), xmlFormat);
writer.write(document);
writer.close();
如上,setEncoding可以设置存储的文件编码格式,createPrettyPrint是得到美化xml格式输出。这样的话,在不同的环境下可以获得同样的编码读写,并且真正保证了文件标称与实际编码的一致性。
【注意】
如
果你使用OutputFormat是为了设置文件编码,那千万别用 XMLWriter(new
FileWriter(...),
outputFormat)构造方法,因为前面已经说了,FileWriter不会处理编码,所以即使你使用
format.setEncoding("utf-8");他仍然不会使用utf-8编码,而只是把文件头指定为utf-8,这类似不使用
outputFormat的情况。而网上好多人举例用了XMLWriter
writer =
new
XMLWriter(
new
FileWriter(
"
output.xml
"
),format);
那是因为他们format.setEncoding("gbk");而windows默认就是gbk,这当然使实际编码与标称的配套了。但实际上,这种方
法是不正确的,java并没有按你写的"gbk"进行编码,而是使用了系统默认编码而已,放到linux就会出现错误,所以一定的小心。
把编码交给操作系统来控制一向是罪恶的,包括java其他地方的参数传递等,如request的参数传递,其他文件读写,如果不使用编码过滤器,不进行编
码指定,可能使得整个系统失去移植性,并产生完全不可预期的错误。找起来头大不说,有时候看到encoding="UTF-8",实际上却是gkb编码会
让你错过关键调试点。
还有就是记事本的罪恶性,用记事本打开不同编码的文件,往往得不到预期的效果,而且你无从得知他到底是用何种编码打开,一般使用EditPlus指定编码打开会好很多。
分享到:
相关推荐
标题中的“dom4j 写UTF-8的xml乱码问题 使用FileOutputStream”涉及的是在使用Java编程语言处理XML文件时遇到的编码问题。DOM4J是一个强大的Java库,用于处理XML、XPath和XSLT,它提供了丰富的API来读取、写入、修改...
7. **XML编解码**:DOM4J提供了XML编码和解码的功能,可以将Java对象序列化为XML,也可以将XML反序列化为Java对象。 8. **性能优化**:DOM4J在设计上考虑了性能优化,通过高效的数据结构和算法,减少了不必要的内存...
在本示例中,我们将深入探讨如何使用DOM4J解析XML文件,以`CacheInit.java`作为我们的核心代码示例,并参考`emailTemplateConfig.xml`作为实际操作的对象。 首先,让我们了解XML(eXtensible Markup Language)。...
Dom4j是一个强大的Java库,专门用于处理XML文档。它提供了简单且灵活的方式来读取、写入、修改以及遍历XML文档。以下是对Dom4j读写XML的详细讲解: 一、Document对象相关 1. **读取XML文件**:通过`SAXReader`实例...
本文将深入探讨如何使用Dom4j解析XML以及解决中文乱码的问题。 首先,让我们了解Dom4j的基本用法。在解析XML文件时,通常会使用`DocumentBuilderFactory`和`DocumentBuilder`来创建一个`Document`对象,然后通过这...
在提供的压缩包中,可能包含了dom4j的jar文件,解压后将其引入项目,就可以开始使用DOM4J进行XML操作了。 DOM4J不仅提供了基本的XML操作,还支持命名空间、事件处理、DTD和XML Schema验证等功能,是Java开发中处理...
### DOM4J创建XML文件知识点解析 #### 一、DOM4J简介 DOM4J(Document Object Model for XML)是一款Java平台下的轻量级XML处理框架。它提供了一种非常简便的方式来读取、写入以及操作XML文档。相比于SAX和DOM等...
本篇文章将深入探讨如何使用DOM4J来解析XML文件,以及通过示例代码来展示其基本操作。 首先,我们需要理解DOM4J的工作原理。DOM4J采用的是DOM(Document Object Model)模型,它将整个XML文档加载到内存中形成一棵...
通过这种方式,我们可以确保DOM4J生成的XML文件采用正确的字符编码,避免了可能出现的乱码问题。同时,这也提醒我们在使用任何处理文本输出的API时,都要注意指定正确的编码,以保证跨平台和多语言环境下的兼容性。 ...
- **XML编码和解码**:DOM4J提供了将XML对象编码为字符串和从字符串解码回XML对象的功能。 DOM4J因其易用性、高性能和丰富的功能而受到广泛欢迎,它是许多Java开发者处理XML文档的首选库。无论你是进行XML解析、...
### 使用dom4j读写XML文档的关键知识点 #### 一、简介与安装 - **DOM4J** 是一款用于处理XML文档的Java库,它提供了简单且强大的API来解析、创建、修改XML文档。 - 官方网站:[http://www.dom4j.org/]...
### DOM4j解析XML文件格式详解 #### 一、DOM4j概述与环境搭建 DOM4j(Document Object Model for XML)是一款Java平台上的开源XML处理库,它提供了灵活、高效且易于使用的API来处理XML数据。DOM4j支持DOM、SAX、...
在实际开发中,`dom4j-1.6.1.jar`是DOM4J库的一个版本,包含了所有需要的类和方法,可以将这个jar文件引入项目中,直接使用DOM4J提供的功能来处理XML。例如,解析XML文件,可以通过`DocumentBuilderFactory`和`...
6. **XML编码与解码**:DOM4J提供了XML编码和解码的功能,使得XML数据可以在网络传输或存储时进行序列化和反序列化。 总的来说,DOM4J是Java开发中处理XML文档的强大工具,它的灵活性、易用性以及高性能使其在各种...
【文件名称】"UML入门教程.pptx"看似与主题"DOM4J格式化XML"不直接相关,但可以假设它是博文作者提供的补充材料,可能是为了帮助读者更好地理解XML处理背后的逻辑,通过UML(统一建模语言)来展示类图、序列图或其他...
7. **XML编解码**:DOM4J提供了对XML编码和解码的支持,可以将XML对象序列化为字符串,或者从字符串反序列化为XML对象。 8. **XPath扩展**:Jaxen支持XPath函数库,包括标准函数以及自定义函数,使查询能力更加强大...
6. **读写XML**:DOM4J可以轻松地读取XML文件,进行修改后保存回磁盘,或者生成新的XML文件。 7. **性能优化**:DOM4J设计时考虑了性能,相比纯DOM解析,DOM4J在内存使用和处理速度上有优势。 **JAXEN库** JAXEN...
这个 API 文档("dom4j_apidocs.rar")包含了一系列 HTML 文件,详细阐述了 DOM4J 的各种类和接口,是学习和使用 DOM4J 的重要参考资料。 1. **XML 解析和生成** - DOM4J 支持多种解析器,包括 SAX 和 DOM。SAX 是...
DOM4J大量利用了Java Collections框架,同时提供了一些性能优化的替代方法,以实现更好的性能或更直观的编码风格。 #### 开发与使用 DOM4J的开发目标与JDOM相似,即提供易于使用且直观的操作体验,但DOM4J更进一步...
- 确保处理XML时正确处理编码,避免乱码问题。 - 在修改XML内容时,务必确保找到的节点是存在的,否则会抛出异常。 - `XMLWriter`的输出格式可以根据需求调整,比如去掉空格和换行,或者使用紧凑格式。 DOM4J的...