`
victorwmh
  • 浏览: 217382 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多
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的转码问题:
分享到:
评论

相关推荐

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    XML越来越热,关于XML的基础教程网络上也随处可见。可是一大堆的概念和术语往往让人望而生畏,很多朋友问我:XML到底有什么用,我们是否需要学习它?我想就我个人学习过程的心得和经验,写一篇比较全面的介绍文章。...

    JAVAEE笔记

    - **DOM4J解析**:DOM4J是一个基于Java的轻量级XML处理库。 - **Document对象**:代表整个XML文档。 - **节点对象**:表示XML文档中的元素、属性等。 - **将文档写入XML文件**:可以将修改后的DOM树重新写回到XML...

    Exporting beans as web services using XFire

    4. jdom.jar:Java DOM(Document Object Model)实现,用于XML文档操作。 5. wsdl4j-1.5.1.jar:WSDL(Web Services Description Language)解析器,用于读取和生成WSDL文件。 6. commons-codec-1.3.jar:包含各种...

    flex PMD - flex代码检查

    3. `dom4j-1.6.1.jar`:这是一个Java XML处理库,flexPMD可能使用它来解析和操作XML格式的配置文件或报告。 4. `commons-lang-2.4.jar`:Apache Commons Lang是Java语言实用工具类的集合,提供了字符串操作、日期...

    J2EE程序员需掌握的技术

    15. **编程协议和XML**:理解HTTP、SMTP等网络协议,以及XML相关的处理库如dom4j和Xerces,对于开发是必需的。 16. **BI和Bug跟踪**:Pentaho用于商业智能,Bugzilla是常用的bug跟踪工具。 17. **媒体库和串口通信...

Global site tag (gtag.js) - Google Analytics