博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
xmlWriter 以UTF-8格式写xml问题
阅读量:6592 次
发布时间:2019-06-24

本文共 3689 字,大约阅读时间需要 12 分钟。

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();        }    }
@Test    public 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

 

@Test    public 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();        }    }

 

转载地址:http://ehdio.baihongyu.com/

你可能感兴趣的文章
控制IMG图片的大小缩放
查看>>
Visual C++ 时尚编程百例006(快捷键)
查看>>
ASP.NET MVC3 系列教程 - 如何使项目Debug进MVC3源代码
查看>>
操作步骤:用ildasm/ilasm修改IL代码
查看>>
HTTP POST GET 本质区别详解
查看>>
【java】构建工具,maven,ant,gradlew
查看>>
51驱动1602液晶显示器的程序
查看>>
委托-利用GetInvocationList处理链式委托
查看>>
正则表达式 之 C#后台应用
查看>>
[Android] 深入浅出Android App耗电量统计
查看>>
对称加密与非对称加密
查看>>
docker学习(5) 在mac中创建mysql docker容器
查看>>
【C语言】字符串替换空格:实现一个函数,把字符串里的空格替换成“%20”
查看>>
C语言--函数
查看>>
BZOJ4605 : 崂山白花蛇草水
查看>>
ajax获取的全部是object,我要获取的是json
查看>>
OC Copy基本使用(深拷贝和浅拷贝)
查看>>
老舍:有了小孩以后,才知道一切事情没那么简单
查看>>
SpringBoot参数校验
查看>>
git 教程 : git 是如此的好用 branch
查看>>