Dom4j保存数据乱码以及xml文件头编码格式改变的原因和解决方法

来源:互联网 发布:制作相片的软件 编辑:程序博客网 时间:2024/05/17 04:43

dom4j解析xml文档请参考:java解析xml的方式总结

dom4j对xml文档进行增删改查后都要将数据写回原文件,有时会出现乱码。

产生乱码原因:

        此时,不管xml文档的编码格式是什么,读入内存的Document都是UTF-8格式的,如果不设定写回时的编码格式,将按照操作系统的编码格式(gb2312或gbk)写回文件。

        如果 xml文档是UTF-8的,而写回时使用的是gb2312(gbk)编码,当然乱码,这是需要指定写回时的编码格式为UTF-8。

        如果xml文档是gb2312(gbk)的编码格式,指定写回时的编码格式为gb2312(gbk)。

解决方法:

  将文件写回时使用的FileFileWriter()改为其他OutputStream类,如使用OutputStreamWriter。

  具体代码如下:

XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/test.xml"), "UTF-8"));writer.write(document);writer.close();

文件头编码格式被改变原因:

  假设此时xml文档的编码格式是gb2312,写回文件的编码格式也是gb2312,那么xml文档就没有乱码了,可是新的问题出来了,文件头的编码格式被改为了UTF-8。这是因为,文档在写回时,文档的头编码格式是根据内存中Document的编码(UTF-8)设定的

 解决方法:

  使用dom4j提供方的输出格式化类OutputFormat

具体代码如下:


OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("gb2312");XMLWriter writer = new XMLWriter(newOutputStreamWriter(         newFileOutputStream("src/test.xml"), "gb2312"), format);writer.write(document);writer.close();

终极解决方案:

使用下面代码

OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");//应和xml文档的编码格式一致XMLWriter writer = new XMLWriter(new FileOutputStream("src/test.xml"), format);writer.write(document);writer.close();
format.setEncoding("UTF-8");中的编码应该和你的xml文档的编码格式一致,这样就能保证,既不出现乱码,也不会出现文件头编码格式改变的情况

原创粉丝点击