Dom4j的asXML()自动编码的解决办法

简介:
在使用Dom4j的时候,有时候需要将一个Document对象转换为一个String,可以直接调用Document.asXML()方法来实现。可是调用这个方法的结果是:生成的字符串按照UTF-8进行了重新编码。这样,如果之前你的xml编码为GBK,那么你的调用此方法后,编码就变为UTF-8了,输出的中文字符就发生乱码。
 
有什么解决方案呢,在网上找了很久,也没找到原因。最后经过翻阅Dom4j的API文档,终于找到一个解决方案----重新格式化XML,这样就有机会对XML重新编码并获取到想要String。
 
从此也想为什么不提供一个Document.asXML(String charset)的方法呢?看来还是Dom4j把中国人忽略了。
 
下面看看解决方案:
 
首先读入文件为String:
        InputStream in = IssuePlan. class.getClassLoader().getResourceAsStream( "temp/test.xml"); 
         if (in ==  null) { 
                log.info( "没有找到temp/test.xml"); 
        } 
        String xml = StringFileToolkit.stream2String(in, charset); 
        Document doc =  null
         try { 
                doc = DocumentHelper.parseText(xml); 
                doc.setXMLEncoding(charset); 
        }  catch (DocumentException e) { 
                e.printStackTrace(); 
                log.error( "XML格式错误,请检查temp/test.xml是否存在于Classpath下以及合理性!"); 
                 throw  new Exception(e); 
        } 
 
这里将XML忠实的按照原有的编码读取出来了,注意,读取出来后,立即对doc对象指定编码,否则会按照操作系统默认的编码处理。
 
如果你在此处调用doc.asXML(),那么,就得到了这个XML文件UTF-8的编码,如果之间不是UTF-8,那么这样编码是错误的。
 
因此,要导出合理编码的字符串,还要调用格式方法,这个方法是我自己写的:
         /** 
         * 格式化XML文档 
         * 
         * @param document xml文档 
         * @param charset    字符串的编码 
         * @return 格式化后XML字符串 
         */
 
         public  static String formatXML(Document document, String charset) { 
                OutputFormat format = OutputFormat.createPrettyPrint(); 
                format.setEncoding(charset); 
                StringWriter sw =  new StringWriter(); 
                XMLWriter xw =  new XMLWriter(sw, format); 
                 try { 
                        xw.write(document); 
                        xw.flush(); 
                        xw.close(); 
                }  catch (IOException e) { 
                        log.error( "格式化XML文档发生异常,请检查!", e); 
                } 
                 return sw.toString(); 
        }
 
你可以随意指定编码,但是你调用之前必须保证你的字符串编码和这里参数的编码一致,这样才是正确的调用。
 
-----------------------------------
这里还有一篇文章,但是忽略了或者是回避了Dom4j的转码问题:


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/235272,如需转载请自行联系原作者
相关文章
|
4月前
|
XML JavaScript 前端开发
JavaScript DOM 操作:解释一下 DOM 是什么?
JavaScript DOM 操作:解释一下 DOM 是什么?
103 0
|
5月前
|
JavaScript 前端开发
(javascript)Vue启动时常见错误及其解决办法
(javascript)Vue启动时常见错误及其解决办法
99 0
|
23天前
|
JavaScript
理解DOM树的加载过程(js的问题)
理解DOM树的加载过程(js的问题)
10 0
|
3月前
|
XML JavaScript 前端开发
javaScript 原生DOM节点操作(最实用的dom节点操作大全)
javaScript 原生DOM节点操作(最实用的dom节点操作大全)
18 0
|
自然语言处理 JavaScript 前端开发
浏览器原理 21 # DOM树:JavaScript是如何影响DOM树构建的?
浏览器原理 21 # DOM树:JavaScript是如何影响DOM树构建的?
124 0
浏览器原理 21 # DOM树:JavaScript是如何影响DOM树构建的?
|
存储 缓存 移动开发
浏览器原理 25 # 虚拟DOM和实际的DOM有何不同?
浏览器原理 25 # 虚拟DOM和实际的DOM有何不同?
100 0
浏览器原理 25 # 虚拟DOM和实际的DOM有何不同?
|
JavaScript
vuejs+typescrpt使用变量获取this属性报错解决办法 Element implicitly has
vuejs+typescrpt使用变量获取this属性报错解决办法 Element implicitly has
vuejs+typescrpt使用变量获取this属性报错解决办法 Element implicitly has
|
JavaScript
js clone 出来的dom中的原先的js时间无效问题
js clone 出来的dom中的原先的js时间无效问题
|
XML Java 数据格式
使用 dom4j 实现修改的操作| 学习笔记
快速学习使用 dom4j 实现修改的操作。
192 0
|
JavaScript
chrome3-使用element调试dom 查看和调试dom节点
chrome3-使用element调试dom 查看和调试dom节点
73 0
chrome3-使用element调试dom 查看和调试dom节点