`

Dom4j创建修改格式化解析XML文件及中文处理(转)

阅读更多

本文主要讨论了用dom4j解析XML的基础问题,包括建立XML文档,添加、修改、删除节点,以及格式化(美化)输出和中文问题。可作为dom4j的入门资料。

1. 下载与安装

dom4j是sourceforge.net上的一个开源项目,主要用于对XML的解析。从2001年7月发布第一版以来,已陆续推出多个版本,目前最高版本为1.5。
dom4j专门针对Java开发,使用起来非常简单、直观,在Java界,dom4j正迅速普及。

可以到
http://sourceforge.net/projects/dom4j下载其最新版。

dom4j1.5的完整版大约13M,是一个名为dom4j-1.5.zip的压缩包,解压后有一个dom4j-1.5.jar文件,这就是应用时需要引入的类包,另外还有一个jaxen-1.1-beta-4.jar文件,一般也需要引入,否则执行时可能抛java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常,其他的包可以选择用之。

2. 示例XML文档(holen.xml)

为了述说方便,先看一个XML文档,之后的操作均以此文档为基础。

  1. holen.xml 
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <books>
  4.     <!--This is a test for dom4j, holen, 2004.9.11-->
  5.     <book show="yes">
  6.        <title>Dom4j Tutorials</title>
  7.     </book>
  8.     <book show="yes">
  9.        <title>Lucene Studing</title>
  10.     </book>
  11.     <book show="no">
  12.        <title>Lucene in Action</title>
  13.     </book>
  14.     <owner>O'Reilly</owner>
  15. </books>

这是一个很简单的XML文档,场景是一个网上书店,有很多书,每本书有两个属性,一个是书名[title],一个为是否展示[show],最后还有一项是这些书的拥有者[owner]信息。

3. 建立一个XML文档

  1. /**
  2.      * 建立一个XML文档,文档名由输入属性决定
  3.      * @param filename 需建立的文件名
  4.      * @return 返回操作结果, 0表失败, 1表成功
  5.      */
  6.     public int createXMLFile(String filename){
  7.        /** 返回操作结果, 0表失败, 1表成功 */
  8.        int returnValue = 0;
  9.        /** 建立document对象 */
  10.        Document document = DocumentHelper.createDocument();
  11.        /** 建立XML文档的根books */
  12.        Element booksElement = document.addElement("books");
  13.        /** 加入一行注释 */
  14.        booksElement.addComment("This is a test for dom4j, holen, 2004.9.11");
  15.        /** 加入第一个book节点 */
  16.        Element bookElement = booksElement.addElement("book");
  17.        /** 加入show属性内容 */
  18.        bookElement.addAttribute("show","yes");
  19.        /** 加入title节点 */
  20.        Element titleElement = bookElement.addElement("title");
  21.        /** 为title设置内容 */
  22.        titleElement.setText("Dom4j Tutorials");
  23.        
  24.        /** 类似的完成后两个book */
  25.        bookElement = booksElement.addElement("book");
  26.        bookElement.addAttribute("show","yes");
  27.        titleElement = bookElement.addElement("title");
  28.        titleElement.setText("Lucene Studing");
  29.        bookElement = booksElement.addElement("book");
  30.        bookElement.addAttribute("show","no");
  31.        titleElement = bookElement.addElement("title");
  32.        titleElement.setText("Lucene in Action");
  33.        
  34.        /** 加入owner节点 */
  35.        Element ownerElement = booksElement.addElement("owner");
  36.        ownerElement.setText("O'Reilly");
  37.        
  38.        try{
  39.            /** 将document中的内容写入文件中 */
  40.            XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));
  41.            writer.write(document);
  42.            writer.close();
  43.            /** 执行成功,需返回1 */
  44.            returnValue = 1;
  45.        }catch(Exception ex){
  46.            ex.printStackTrace();
  47.        }
  48.               
  49.        return returnValue;
  50.     }

说明:
Document document = DocumentHelper.createDocument();
通过这句定义一个XML文档对象。

Element booksElement = document.addElement("books");
通过这句定义一个XML元素,这里添加的是根节点。
Element有几个重要的方法:
l         addComment:添加注释
l         addAttribute:添加属性
l         addElement:添加子元素

最后通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,可以通过OutputFormat类的createCompactFormat()方法或createPrettyPrint()方法格式化输出,默认采用createCompactFormat()方法,显示比较紧凑,这点将在后面详细谈到。

生成后的holen.xml文件内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <books><!--This is a test for dom4j, holen, 2004.9.11--><book show="yes"><title>Dom4j Tutorials</title></book><book show="yes"><title>Lucene Studing</title></book><book show="no"><title>Lucene in Action</title></book><owner>O'Reilly</owner></books>

4. 修改XML文档

有三项修改任务,依次为:
l         如果book节点中show属性的内容为yes,则修改成no
l         把owner项内容改为Tshinghua,并添加date节点
l         若title内容为Dom4j Tutorials,则删除该节点

  1.    /**
  2.      * 修改XML文件中内容,并另存为一个新文件
  3.      * 重点掌握dom4j中如何添加节点,修改节点,删除节点
  4.      * @param filename 修改对象文件
  5.      * @param newfilename 修改后另存为该文件
  6.      * @return 返回操作结果, 0表失败, 1表成功
  7.      */
  8.     public int ModiXMLFile(String filename,String newfilename){
  9.        int returnValue = 0;
  10.        try{
  11.            SAXReader saxReader = new SAXReader(); 
  12.            Document document = saxReader.read(new File(filename));
  13.            /** 修改内容之一: 如果book节点中show属性的内容为yes,则修改成no */
  14.            /** 先用xpath查找对象 */
  15.            List list = document.selectNodes("/books/book/@show" ); 
  16.            Iterator iter = list.iterator();
  17.            while(iter.hasNext()){
  18.               Attribute attribute = (Attribute)iter.next();
  19.               if(attribute.getValue().equals("yes")){
  20.                   attribute.setValue("no");
  21.               }   
  22.            }
  23.            
  24.            /**
  25.             * 修改内容之二: 把owner项内容改为Tshinghua
  26.             * 并在owner节点中加入date节点,date节点的内容为2004-09-11,还为date节点添加一个属性type
  27.             */
  28.            list = document.selectNodes("/books/owner" );
  29.            iter = list.iterator();
  30.            if(iter.hasNext()){
  31.               Element ownerElement = (Element)iter.next();
  32.               ownerElement.setText("Tshinghua");
  33.               Element dateElement = ownerElement.addElement("date");
  34.               dateElement.setText("2004-09-11");
  35.               dateElement.addAttribute("type","Gregorian calendar");
  36.            }
  37.            
  38.            /** 修改内容之三: 若title内容为Dom4j Tutorials,则删除该节点 */
  39.            list = document.selectNodes("/books/book");
  40.            iter = list.iterator();
  41.            while(iter.hasNext()){
  42.               Element bookElement = (Element)iter.next();
  43.               Iterator iterator = bookElement.elementIterator("title");
  44.               while(iterator.hasNext()){
  45.                   Element titleElement=(Element)iterator.next();
  46.                   if(titleElement.getText().equals("Dom4j Tutorials")){
  47.                      bookElement.remove(titleElement);
  48.                   }
  49.               }
  50.            }          
  51.            
  52.            try{
  53.               /** 将document中的内容写入文件中 */
  54.               XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));
  55.               writer.write(document);
  56.               writer.close();
  57.               /** 执行成功,需返回1 */
  58.               returnValue = 1;
  59.            }catch(Exception ex){
  60.               ex.printStackTrace();
  61.            }
  62.            
  63.        }catch(Exception ex){
  64.            ex.printStackTrace();
  65.        }
  66.        return returnValue;
  67.     }
  68.      

说明:
List list = document.selectNodes("/books/book/@show" );
list = document.selectNodes("/books/book");
上述代码通过xpath查找到相应内容。

通过setValue()、setText()修改节点内容。

通过remove()删除节点或属性。

5. 格式化输出和指定编码

默认的输出方式为紧凑方式,默认编码为UTF-8,但对于我们的应用而言,一般都要用到中文,并且希望显示时按自动缩进的方式的显示,这就需用到OutputFormat类。


  1.     /**
  2.      * 格式化XML文档,并解决中文问题
  3.      * @param filename
  4.      * @return
  5.      */
  6.     public int formatXMLFile(String filename){
  7.        int returnValue = 0;
  8.        try{
  9.            SAXReader saxReader = new SAXReader(); 
  10.            Document document = saxReader.read(new File(filename));
  11.            XMLWriter writer = null;
  12.            /** 格式化输出,类型IE浏览一样 */
  13.            OutputFormat format = OutputFormat.createPrettyPrint();
  14.            /** 指定XML编码 */
  15.            format.setEncoding("GBK");
  16.            writer= new XMLWriter(new FileWriter(new File(filename)),format);
  17.            writer.write(document);
  18.            writer.close();      
  19.            /** 执行成功,需返回1 */
  20.            returnValue = 1;     
  21.        }catch(Exception ex){
  22.            ex.printStackTrace();
  23.        }
  24.        return returnValue;
  25.     }

说明:

OutputFormat format = OutputFormat.createPrettyPrint();
这句指定了格式化的方式为缩进式,则非紧凑式。

format.setEncoding("GBK");
指定编码为GBK。

XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)),format);
这与前面两个方法相比,多加了一个OutputFormat对象,用于指定显示和编码方式。

6. 完整的类代码

前面提出的方法都是零散的,下面给出完整类代码。

  1. Dom4jDemo.java 
  2. package com.holen.dom4j;

  3. import java.io.File;
  4. import java.io.FileWriter;
  5. import java.util.Iterator;
  6. import java.util.List;

  7. import org.dom4j.Attribute;
  8. import org.dom4j.Document;
  9. import org.dom4j.DocumentHelper;
  10. import org.dom4j.Element;
  11. import org.dom4j.io.OutputFormat;
  12. import org.dom4j.io.SAXReader;
  13. import org.dom4j.io.XMLWriter;

  14. //如果是UTF-8 FileWriter 改用 FileOutputStream 
  15. public class Dom4jDemo{
  16.   public Dom4jDemo (){}
   public static void main (String[] args){
          Dom4jDemo temp = new Dom4jDemo();
         temp.createXMLFile("D:/beans.xml");
         temp.ModiXMLFile("D:/beans.xml","D:/beans1.xml");
          temp.formatXMLFile("D:/beans1.xml");
      }
  1. }

 

分享到:
评论

相关推荐

    dom4j解析xml文件的压缩包

    8. **转换与格式化**:DOM4J可以将XML Document对象转换为String或OutputStream,同时提供XML格式化的功能,使得输出的XML更易于阅读。 9. **JAXB集成**:DOM4J可以与Java的默认XML绑定框架JAXB进行集成,方便地将...

    DOM4J格式化XML

    通常,这涉及到解析XML文件,创建Document对象,然后使用DOM4J提供的方法来设置格式化选项,最后将格式化后的XML输出到文件或控制台。 【标签】"源码"提示我们,这篇内容可能深入到DOM4J的源代码层面,解释了内部的...

    基于DOM4j和POI实现的XML文件转换为XLS(即标准EXCEL)的JAVA程序

    本项目就是关于如何使用DOM4j解析XML文件,并利用Apache POI将其转换为标准的XLS(Excel)文件。 首先,DOM4j是Java中一个灵活且功能强大的XML处理库,它提供了完整的API来读取、操作和写入XML文档。通过DOM4j,...

    Dom 4j 格式化xml补充

    ### Dom 4j 格式化 XML 输出详解 #### 概述 Dom 4j 是一个用于处理 XML 文件的强大 Java 库。它提供了一系列简单易用的 API,可以帮助开发者高效地解析、创建和修改 XML 文档。其中,格式化 XML 输出是 Dom 4j ...

    使用DOM4j解析XML文件

    ### 使用DOM4j解析XML文件:提升开发效率与代码可读性 在现代软件开发中,XML(Extensible Markup Language)是一种广泛使用的数据交换格式,它以人类可读的文本形式存储结构化信息。然而,如何高效、准确地解析XML...

    Dom4j结合XPath解析XML文件路径表达式

    本篇文章将深入探讨如何使用Dom4j,一个流行的Java库,结合XPath来解析XML文件中的路径表达式,同时阐述相对路径和绝对路径的匹配原则。 首先,我们要了解Dom4j库。Dom4j是一个灵活且高效的处理XML的Java库,它提供...

    dom4j以String的方式读取XML的内容,并给String的值赋值,写入XML中

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活且高效的API,使得XML的解析、创建、修改变得更加简单。在这个场景中,我们关注的是如何使用DOM4J以String的形式读取XML内容,然后将String的值赋给XML...

    DOM4J解析XML

    1. **DOM解析方式**:DOM4J通过DOM接口来解析XML,将整个XML文档加载到内存中形成一个树形结构,称为DOM树。这样做的优点是可以方便地通过路径导航访问任何元素,缺点是如果XML文件过大,可能会消耗大量内存。 2. *...

    Dom4j解析XML及中文问题

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

    dom4j创建xml文件

    ### DOM4J创建XML文件知识点解析 #### 一、DOM4J简介 DOM4J(Document Object Model for XML)是一款Java平台下的轻量级XML处理框架。它提供了一种非常简便的方式来读取、写入以及操作XML文档。相比于SAX和DOM等...

    dom4j解析xml文件的例子

    首先,解析XML文件的核心在于创建Document对象,这可以通过DOM4J的`DocumentHelper`类的`parseText()`或`readFile()`方法实现。例如: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; ...

    dom4j的jar包,用于解析XML文件

    4. **读取和写入XML**:DOM4J可以轻松读取XML文件并将其内容加载到内存中,也可以将内存中的XML结构写回文件,支持格式化的XML输出。 5. **命名空间(Namespace)支持**:对于包含命名空间的XML文档,DOM4J提供了很...

    XML文件解析的_DOM4J-最新jar

    这个“XML文件解析的_DOM4J-最新jar”是一个包含DOM4J库的最新版本的Java档案(JAR)文件,用于在Java项目中处理XML。 DOM4J的主要功能包括: 1. **XML解析**:DOM4J支持多种解析方式,如DOM、SAX和StAX。其中,...

    dom4解析xml需要的包

    1. **解析XML**:DOM4J支持使用DOM、SAX或StAX解析器读取XML文件,其中DOM是将整个XML文档加载到内存中,适用于小型文件;SAX是事件驱动的解析,适用于大文件;而StAX则提供了一种更高效的方式,通过迭代器逐个处理...

    Android 创建与解析XML Dom4j方式

    本文将深入探讨如何使用Dom4j库在Android环境中创建和解析XML文档。 首先,了解XML(eXtensible Markup Language)的基本概念。XML是一种标记语言,它允许我们在文档中嵌入结构化数据。它的主要优点是数据与显示...

    利用dom4j--读取xml文件

    综上所述,DOM4J为处理XML文件提供了强大的工具,无论是读取、遍历、查询还是修改XML内容,都十分方便。在实际项目中,根据具体需求灵活运用DOM4J,能够极大地提高XML操作的效率和便利性。在"DataXml"这个示例中,你...

    dom4j.jar 解析xml文件的最佳工具

    DOM4J之所以被誉为解析XML的最佳工具,是因为它具有以下显著优点: 1. **易于使用**:DOM4J的API设计简洁明了,开发者可以快速上手。它支持多种解析方式,包括DOM、SAX和StAX,可以根据项目需求选择最适合的方法。 ...

    dom4j API 用于解析XML的java库

    DOM4J作为解析XML的工具,其主要功能和特性包括: 1. **DOM模型**:DOM4J提供了基于DOM(Document Object Model)的接口,允许开发者以树形结构操作XML文档。通过`Document`对象,可以访问XML文档的根元素,并通过`...

    dom4j读写xml文件

    1. **解析XML文件**:使用DOM4J的`DocumentHelper`类的`parseText()`或`parse()`方法,可以将XML文件加载为一个`Document`对象。例如: ```java Document document = DocumentHelper.parseText(xmlString); ``` ...

    XML的DOM4J的解析方式

    2. **创建Document对象**:解析XML文件时,DOM4J会构建一个Document对象,它是整个XML文档的根节点。使用`DocumentBuilderFactory`和`DocumentBuilder`来实现: ```java DocumentFactory documentFactory = ...

Global site tag (gtag.js) - Google Analytics