`
hojor
  • 浏览: 110599 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dom4j生成xml中文问题

    博客分类:
  • java
阅读更多
这几天开始学习dom4j,在网上找了篇文章就开干了,上手非常的快,但是发现了个问题就是无法以UTF-8保存xml文件,保存后再次读出的时候会报“Invalid byte 2 of 2-byte UTF-8 sequence.”这样一个错误,检查发现由dom4j生成的这个文件,在使用可正确处理XML编码的任何的编辑器中中文成乱码,从记事本查看并不会出现乱码会正确显示中文。让我很是头痛。试着使用GBK、gb2312编码来生成的xml文件却可以正常的被解析。因此怀疑的dom4j没有对utf-8编码进行处理。便开始查看dom4j的原代码。终于发现的问题所在,是自己程序的问题。
    在dom4j的范例和网上流行的《DOM4J 使用简介》这篇教程中新建一个xml文档的代码都类似如下

     public void createXML(String fileName) {

         Document doc = org.dom4j.DocumentHelper.createDocument();

         Element root = doc.addElement("book");

         root.addAttribute("name", "我的图书");



         Element childTmp;

         childTmp = root.addElement("price");

         childTmp.setText("21.22");



         Element writer = root.addElement("author");

         writer.setText("李四");

         writer.addAttribute("ID", "001");



         try {

             org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(

                     new FileWriter(fileName));

             xmlWriter.write(doc);

             xmlWriter.close();

         }

         catch (Exception e) {

             System.out.println(e);

         }

     }

    在上面的代码中输出使用的是FileWriter对象进行文件的输出。这就是不能正确进行文件编码的原因所在,java中由Writer类继承下来的子类没有提供编码格式处理,所以dom4j也就无法对输出的文件进行正确的格式处理。这时候所保存的文件会以系统的默认编码对文件进行保存,在中文版的window下java的默认的编码为GBK,也就是所虽然我们标识了要将xml保存为utf-8格式但实际上文件是以GBK格式来保存的,所以这也就是为什么能够我们使用GBK、GB2312编码来生成xml文件能正确的被解析,而以UTF-8格式生成的文件不能被xml解析器所解析的原因。
    好了现在我们找到了原因所在了,我们来找解决办法吧。首先我们看看dom4j是如何实现编码处理的


    public XMLWriter(OutputStream out) throws UnsupportedEncodingException {

         //System.out.println("In OutputStream");

         this.format = DEFAULT_FORMAT;

         this.writer = createWriter(out, format.getEncoding());

         this.autoFlush = true;

        namespaceStack.push(Namespace.NO_NAMESPACE);

     }



     public XMLWriter(OutputStream out, OutputFormat format) throws UnsupportedEncodingException {

         //System.out.println("In OutputStream,OutputFormat");

         this.format = format;

         this.writer = createWriter(out, format.getEncoding());

         this.autoFlush = true;

        namespaceStack.push(Namespace.NO_NAMESPACE);

     }




     /**

      * Get an OutputStreamWriter, use preferred encoding.

      */

     protected Writer createWriter(OutputStream outStream, String encoding) throws UnsupportedEncodingException {

         return new BufferedWriter(

             new OutputStreamWriter( outStream, encoding )

         );

     }

    由上面的代码我们可以看出dom4j对编码并没有进行什么很复杂的处理,完全通过java本身的功能来完成。所以我们在使用dom4j的来生成我们的XML文件时不应该直接为在构建XMLWriter时,不应该直接为其赋一个Writer对象,而应该通过一个OutputStream的子类对象来构建。也就是说在我们上面的代码中,不应该用FileWriter对象来构建xml文档,而应该使用FileOutputStream对象来构建所以将代码修改入下:
     public void createXML(String fileName) {

         Document doc = org.dom4j.DocumentHelper.createDocument();

         Element root = doc.addElement("book");

         root.addAttribute("name", "我的图书");



         Element childTmp;

         childTmp = root.addElement("price");

         childTmp.setText("21.22");



         Element writer = root.addElement("author");

         writer.setText("李四");

         writer.addAttribute("ID", "001");



         try {
             //注意这里的修改


             org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(

                     new FileOutputStream(fileName));

             xmlWriter.write(doc);

             xmlWriter.close();

         }

         catch (Exception e) {

             System.out.println(e);

         }

     }
  
    至此DOM4J的问题编码问题算是告一段落,希望对此文章对其他朋友有用
分享到:
评论

相关推荐

    Dom4J生成XML的完整方法希望大家能用到

    ### Dom4J生成XML的完整方法详解 在Java开发领域,处理XML文档是常见的需求之一。Dom4J作为一款优秀的Java XML API,以其简洁、高效的特点,在生成、解析和操作XML文档方面表现突出。本文将深入探讨如何使用Dom4J库...

    利用Dom4j生成XML和解析XML

    "Dom4j 生成 XML 和解析 XML" Dom4j 是一个 Java 库,用于处理 XML 文档。它提供了生成和解析 XML 文档的功能。在本文中,我们将学习如何使用 Dom4j 生成 XML 文档和解析 XML 文档。 生成 XML 文档 使用 Dom4j ...

    dom4j生成xml

    该项目采用dom4j从数据库表中生成xml数据 项目文档、数据库建表语句均已放置在项目中。 关键代码如下: public String getXml(Connection conn, int rm_id, String path) { //声明xml字符串 String file...

    dom4j解析及生成 xml代码收集

    压缩包中的`dom4j生成xml文件.txt`可能包含了使用DOM4J生成XML文件的代码片段。通常,这会包括创建`Document`对象,添加元素,设置属性,以及将文档写入文件的相关步骤。实际代码可能如下: ```java import org....

    dom4j解析xml文件的压缩包

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活且高效的API,使得XML的解析、创建、查询和修改变得简单。这个压缩包包含了DOM4J的完整版本,适用于那些希望在Java项目中使用DOM4J进行XML操作的开发者...

    dom4j解析xml详解

    - **数据交换**: 在不同的系统之间交换XML格式的数据,DOM4J可以轻松解析和生成XML文档。 - **配置文件解析**: 许多应用使用XML作为配置文件的格式,DOM4J可以方便地读取和更新这些配置信息。 - **Web服务**: 在SOAP...

    Dom4j解析XML文档.doc

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活、高效的API,使得XML的解析、创建、修改和查询变得简单。DOM4J采用了近似于DOM(Document Object Model)的接口,但它的设计更加轻量级,性能更优。在...

    使用Fusion Charts制作报表(dom4j生成XML)

    这篇博客"使用Fusion Charts制作报表(dom4j生成XML)"主要介绍了如何利用Fusion Charts结合DOM4J库来生成XML数据,从而创建动态报表。 首先,我们需要理解Fusion Charts的核心概念。Fusion Charts提供了一系列预定...

    java dom4j中生成xml文件

    在DOM4J中生成XML文件主要涉及以下几个关键概念和步骤: 1. **Document对象**:这是DOM4J的核心,表示整个XML文档。你可以通过`DocumentFactory`创建一个空的`Document`对象,然后添加元素、属性等。 2. **Element...

    dom4J生成xml、解析xml、生成xml文件实例

    **dom4J生成和解析XML文件** DOM4J是一个强大的Java XML API,它不仅提供了DOM、SAX和JDOM等接口的实现,还提供了一种更简单、更灵活的方式来处理XML文档。这篇博客()可能详细介绍了如何使用DOM4J来生成和解析XML...

    dom4j 输出XML时中文乱码解决

    然而,在使用 Dom4J 输出 XML 文档时,中文字符可能会出现乱码问题。这是因为 Dom4J 的默认编码方式可能不支持中文字符。解决这个问题的方法是将输出编码方式设置为 UTF-8。 设置输出编码方式 ------------------ ...

    Dom4j解析XML及中文问题

    本文将深入探讨如何使用Dom4j解析XML以及解决中文乱码的问题。 首先,让我们了解Dom4j的基本用法。在解析XML文件时,通常会使用`DocumentBuilderFactory`和`DocumentBuilder`来创建一个`Document`对象,然后通过这...

    dom4j生成XML文档及解析

    【DOM4J生成XML文档及解析】 DOM4J是一个Java库,它提供了处理XML文档的强大功能,包括创建、修改和查询XML。在这个场景中,我们将深入理解如何使用DOM4J来生成XML文档以及如何解析XML内容。 首先,生成XML文档...

    Dom4j解析和生成XML文档

    DOM4J生成XML文档: 生成XML文档时,DOM4J允许我们通过创建`Element`、`Attribute`等对象,构建一个内存中的XML结构,然后将其转换为XML字符串或写入文件。 1. 创建`Document`对象:`Document document = ...

    DOM、SAX、DOM4J、JDOM、StAX生成XML并返回XML字符串形式

    在生成XML字符串时,DOM4J提供了简洁的API来构建和输出XML文档。 4. JDOM JDOM是另一个Java的XML处理库,它专注于提供纯Java解决方案。JDOM提供了一个基于树的API,类似于DOM,但设计更简洁,易于使用。与DOM相比,...

    使用Maven管理项目,实现DOM4j操作XML文件

    DOM4j则是一个强大的Java库,用于处理XML文档,提供了丰富的API来实现XML的读取、写入、修改等操作。在这个示例中,我们将深入探讨如何利用Maven管理和DOM4j来操作XML文件。 首先,让我们了解一下Maven。Maven是...

    java dom4j解析xml

    Java DOM4J解析XML是一种常见的处理XML文档的技术,它提供了灵活且高效的API,使得开发者能够方便地读取、写入、修改以及操作XML文件。DOM4J是Java中一个非常强大的XML处理库,它结合了DOM、SAX和JDOM的优点,同时也...

    生成、解析xml的四种方式(dom,dom4j,sax,jdom)

    本文将详细介绍生成和解析XML的四种主要方法:DOM、DOM4J、SAX和JDOM。 1. DOM(Document Object Model) DOM是W3C组织推荐的一种解析XML的标准方式。它将XML文档视为一个树形结构,每个节点代表XML文档的一部分。...

    dom4j解析xml

    DOM4J作为一个强大的XML处理库,提供了丰富的API,使得XML的解析、操作和生成变得更加简单。无论是处理小规模的XML文档还是大型XML数据,DOM4J都能提供高效且易于使用的解决方案。通过阅读和理解`Test.java`中的代码...

    dom4j 解析写入xml

    1、xml文档解析 2、 dom4j解析xml 3、实现xml文件解析 xml字符串解析 xml MAP键值对解析 4、实现xml写入与生成文件

Global site tag (gtag.js) - Google Analytics