xmlWriter 以UTF-8格式写xml问题

dom4j中的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的情况。

以下为个人实践代码:

    /*** 输出xml文件* * @param document* @param filePath* @throws IOException*/public static void writeXml(Document document, String filePath) throws IOException {File xmlFile = new File(filePath);XMLWriter writer = null;try {if (xmlFile.exists())xmlFile.delete();writer = new XMLWriter(new FileOutputStream(xmlFile), OutputFormat.createPrettyPrint());writer.write(document);writer.close();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (writer != null)writer.close();}}
    @Testpublic void testXMLDoc() {try {String filePath = "E:/eXML.xml";Document document = XMLUtil.getDocument(filePath);Element root = null;document = XMLUtil.createDocument("vrvscript", "Class", "POLICY_BASE_LINE");root = document.getRootElement();root.addAttribute("P_ID", "12");root.addAttribute("StartPolicy", "1中文");root.addAttribute("PolicyVersion", "1.0");root.addAttribute("ScheduleMode", "6");root.addAttribute("ScheduleTime", "1:1:1");root.addAttribute("RuleHandle", "2");XMLUtil.writeXml(document, filePath);} catch (IOException e) {e.printStackTrace();}}

测试结果发现:当写入的内容包含中文时产生的xml文件是UTF-8;但如果写入的内容中不包含中文,仅包含ANSI字符,那么产生的xml文件就是ANSI

 

@Testpublic void testXMLDoc() {try {String filePath = "E:/eXML.xml";Document document = XMLUtil.getDocument(filePath);Element root = null;document = XMLUtil.createDocument("vrvscript", "Class", "POLICY_BASE_LINE");root = document.getRootElement();root.addAttribute("P_ID", "12");root.addAttribute("StartPolicy", "1");root.addAttribute("PolicyVersion", "1.0");root.addAttribute("ScheduleMode", "6");root.addAttribute("ScheduleTime", "1:1:1");root.addAttribute("RuleHandle", "2");XMLUtil.writeXml(document, filePath);} catch (IOException e) {e.printStackTrace();}}

 

转载于:https://www.cnblogs.com/liaojie970/p/5280074.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux线程(互斥锁、条件)

线程概念&#xff1a; 典型的UNIX/Linux进程可以看成只有一个控制线程&#xff1a;一个进程在同一时刻只做一件事情。有了多个控制线程后&#xff0c;在程序设计时可以把进程设计成在同一时刻做不止一件事&#xff0c;每个线程各自处理独立的任务。 进程是程序执行时的一个实例…

centos下防火墙设置

1、开启防火墙 systemctl start firewalld2、开放指定端口firewall-cmd --zonepublic --add-port8888/tcp --permanent命令含义&#xff1a; --zone #作用域 --add-port1935/tcp #添加端口&#xff0c;格式为&#xff1a;端口/通讯协议 --permanent #永久生效&#xff0c;没有…

linux网络编程、socket编程

进程间通信&#xff1a; 特点&#xff1a;依赖于内核&#xff0c;造成缺陷——无法实现多机通信。 网络&#xff1a; 地址&#xff1a;由IP地址&#xff08;IP地址是IP协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一个逻辑地址&#xf…

【Python】Python Mako模板使用

参考资料&#xff1a; Mako Templates for Python官网&#xff1a;http://www.makotemplates.org/ Python模板库Mako的用法&#xff1a;http://my.oschina.net/u/877170/blog/290438 Mako 1.0.4 Documentation&#xff1a;http://docs.makotemplates.org/en/latest/usage.html#…

简单的ftp服务器(客户端、服务器端、socket)

查看本机IP地址&#xff1a; 127.0.0.1 服务器功能&#xff1a; 可以获取服务器文件使用get指令可以展示服务器有哪些文件使用ls指令进入服务器某个文件夹使用指令cd文件夹名称上传本地文件到服务器&#xff0c;使用指令putpwd可以查看客户端在当前服务器的位置 客户端本地…

JavaScript 全局对象

JavaScript 全局对象 全局属性和函数可用于所有内建的 JavaScript 对象。 顶层函数&#xff08;全局函数&#xff09; 函数描述decodeURI()解码某个编码的 URI。decodeURIComponent()解码一个编码的 URI 组件。encodeURI()把字符串编码为 URI。encodeURIComponent()把字符串编码…

Redis持久化方式~RDB 持久化和AOF 持久化

持久化 Redis 是内存型数据库&#xff0c;为了保证数据在断电后不会丢失&#xff0c;需要将内存中的数据持久化到硬盘上。 RDB 持久化 将某个时间点的所有数据都存放到硬盘上。 可以将快照复制到其它服务器从而创建具有相同数据的服务器副本。 如果系统发生故障&#xff0…

Linux文件和目录权限笔记

查看文件或者目录的权限命令&#xff1a;ls -al # -a 表示全部文件包含隐藏文件&#xff0c;-l 表示列出每个文件的详细信息比如执行 ls -altotal 115drwxr--x--- 4 root root 4096 Oct 24 02:07 install.log格式说明&#xff1a;通过 ls -al 格式化输出的文件详细信息&#x…

python基础:序列(列表、元组、字符串)、函数、字典、集合

Python语言运行环境&#xff1a; windowslinuxunixMacos等等 博客记录内容&#xff1a; Python3的所有语法、面向对象思维、运用模块进行编程、游戏编程、计算机仿真。 Python是什么类型的语言&#xff1a; Python是脚本语言&#xff0c;脚本语言(Scripting language)是电脑…

Redis 与 Memcached的区别

Redis 与 Memcached 两者都是非关系型内存键值数据库&#xff0c;主要有以下不同&#xff1a; 数据类型 Memcached 仅支持字符串类型&#xff0c;而 Redis 支持五种不同的数据类型&#xff0c;可以更灵活地解决问题。 数据持久化 Redis 支持两种持久化策略&#xff1a;RDB…

python基础(文件、异常、模块、类、对象)

文件&#xff1a; 打开文件使用open函数&#xff0c;open()的第一个参数是&#xff1a;要打开文件的路径&#xff0c;如果只传入文件名那么将在当前文件下查找文件并打开。第二个参数是&#xff1a;文件的打开模式&#xff0c;其他参数都是默认的。文件的打开模式如下图所示&a…

redis 和 memcached 的区别

redis 和 memcached 的区别 对于 redis 和 memcached 我总结了下面四点。现在公司一般都是用 redis 来实现缓存&#xff0c;而且 redis 自身也越来越强大了&#xff01; redis支持更丰富的数据类型&#xff08;支持更复杂的应用场景&#xff09;&#xff1a;Redis不仅仅支持简…

树莓派入门(树莓派登录的几种方式)

什么是嵌入式&#xff1f; 嵌入式即嵌入式系统&#xff0c;IEEE&#xff08;美国电气和电子工程师协会&#xff09;对其定义是用于控制、监视或者辅助操作机器和设备的装置&#xff0c;是一种专用的计算机系统。国内普遍认同的嵌入式系统定义是以应用为中心&#xff0c;以计算…

git 如何删除本地创建的仓库(转载自 https://segmentfault.com/q/1010000002996177?_ea=262685)...

可以先清除本地文件夹下的git文件&#xff0c;然后在重新初始化新建的git仓库 //删除文件夹下的所有 .git 文件 find . -name ".git" | xargs rm -Rf接着add&#xff0c;commit等操作即可转载于:https://www.cnblogs.com/xiahl/p/5289266.html

mysql中SQL查询优化方法总结

1.对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描&#xff0c;如&#xff1a;select id from t w…

Linux库概念及相关编程(动态库、静态库、环境变量)

分文件编程&#xff1a; 好处&#xff1a;分模块编程思想&#xff0c;功能和责任划分清楚便与调试&#xff0c;main函数简洁&#xff0c;代码易于阅读。编程时头文件有的是使用<>这个符号括起来的&#xff0c;有的是" "使用的是双引号&#xff0c;使用尖括号括…

复利计算器

import java.util.Scanner;public class Fulijisuan {public static void main(String[] args) {// TODO Auto-generated method stubdouble F0;double singlesum0;double doublesum0;double m0;Scanner scanner new Scanner(System.in);System.out.println("1:复利计算\n…

kali扫描内网ip_Metasploit路由转发实现内网渗透

利用背景在渗透的过程中常常会遇到这种场景&#xff1a;我们已经通过web渗透拿下一台内网服务器&#xff0c;为了进一步进行内网渗透&#xff0c;我们会利用“沦陷主机”作为跳板进行进一步的内网渗透&#xff0c;扩大战果。现在假设的场景是此时我们已经拿下一台内网服务器的远…

.NET Core 3.0 中的新变化

译者&#xff1a;楚人Leo译文&#xff1a;http://www.cnblogs.com/leolion/p/10585834.html原文&#xff1a;https://msdn.microsoft.com/en-us/magazine/mt848631.aspx.NET Core 3.0 是 .NET Core 平台的下一主要版本。本文回顾 .NET Core 发展历史&#xff0c;并展示了它是如…