`
jaychang
  • 浏览: 734888 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

dom4j生成,解析,修改XML的简单操作

    博客分类:
  • XML
阅读更多

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

 
dom4j是 sourceforge.net上的一个开源项目,主要用于对 XML的解析。从2001 年7 月发布
第一版以来,已陆续推出多个版本,目前最高版本为1.5。
dom4j专门针对Java 开发,使用起来非常简单、直观,在Java 界,dom4j正迅速普及。
 
可以到http://sourceforge.net/projects/dom4j下载其最新版。
 
dom4j-1.6.1.zip的压缩包,解压后有一个dom4j-1.6.1.jar
文件,这就是应用时需要引入的类包,另外还有一个 jaxen-1.1-beta-6.jar 文件,一般也需要
引入,否则执行时可能抛java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常,其
他的包可以选择用之。

 

2  示例XML

 

为了方便起见,先定义了一个XML文档,可能有不合理的地方,但只是为了演示dom4j对XML文档如何进行简单的基本操作的。

 

<?xml version="1.0" encoding="GBK"?>

<books>
  <!--This is a test for dom4j,the goal is just for learn the base use dom4j -->
  <book version="1.0">
    <title>Think In Java 0</title>
    <author>Jay Chang0
      <name pastUsedName="Jay"/>
    </author>
    <publisher>Tsing Hua</publisher>
  </book>
  <book version="1.0">
    <title>Think In Java 1</title>
    <author>Jay Chang1
      <name pastUsedName="Jay"/>
    </author>
    <publisher>Tsing Hua</publisher>
  </book>
  <book version="1.0">
    <title>Think In Java 2</title>
    <author>Jay Chang2
      <name pastUsedName="Jay"/>
    </author>
    <publisher>Tsing Hua</publisher>
  </book>
</books>

例子的XML文件用于村粗多本书 的信息,书的信息包括书名,作者(作者元素有以子元素name,name元素由一个属性,代表作者的曾用名),出版社,book元素有一个version(版本)属性,待会在修改XML文档时会用到。

 

3   创建XML文档

 

      /**
     * 创建一个XML文档文件名及存储路径由filePath指定(如"D:\\dom4j_example\\books.xml")
     * 
     * @param filePath 文件存储路径及文件名
     * @return ret 操作成功返回0,否则返回-1
     */
    public static int createXMLDocument(String filePath) {
      Document xmlDocument = DocumentHelper.createDocument();
      // 可以通过OutputFormat来设置
      // xmlDocument.setXMLEncoding("UTF-8");
      Element booksElement = xmlDocument.addElement("books");
      xmlDocument.setRootElement(booksElement);
      //添加一注释
      booksElement
          .addComment("This is a test for dom4j,the goal is just for learn the base use dom4j ");
      //向books元素添加3个book元素
      for (int i = 0; i < 3; i++) {
        Element bookOne = booksElement.addElement("book");
        bookOne.addAttribute("version", "1.0");
        Element bookOneTitle = bookOne.addElement("title");
        bookOneTitle.setText("Think In Java " + i);
        Element bookOneAuthor = bookOne.addElement("author");
        bookOneAuthor.setText("Jay Chang" + i);
        Element bookOneAuthorName = bookOneAuthor.addElement("name");
        bookOneAuthorName.addAttribute("pastUsedName", "Jay");
        Element publish = bookOne.addElement("publisher");
        publish.setText("Tsing Hua");
      }
      int ret = -1;
      XMLWriter writer = null;
      try {
        int indexOfLastSeparator = filePath.lastIndexOf(File.separator);
        String directoryStr = filePath.substring(0, indexOfLastSeparator);
        File directory = new File(directoryStr);
        if (!directory.exists()) {
          System.out.println(directory);
          directory.mkdirs();
        }
        String fileName = filePath.substring(indexOfLastSeparator + 1);
        File xmlFile = new File(directory, fileName);
        if (!xmlFile.exists()) {
          System.out.println(xmlFile);
          xmlFile.createNewFile();
        }
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("GBK");
        writer = new XMLWriter(new FileWriter(xmlFile), format);
        writer.write(xmlDocument);
        ret = 0;
      } catch (IOException e) {
        e.printStackTrace();
      } finally {
        if (writer != null)
          try {
            writer.close();
          } catch (IOException e) {
            e.printStackTrace();
          }
      }
      return ret;
    }
 

    说明:
Document document = DocumentHelper.createDocument();
通过这句定义一个XML文档对象。
 
Element booksElement = document.addElement("books");
通过这句定义一个XML元素,这里添加的是根节点。
Element有几个重要的方法:
l  l          addComment:添加注释
l  l          addAttribute:添加属性
l  l          addElement:添加子元素
 
最后通过 XMLWriter 生成物理文件,默认生成的 XML 文件排版格式比较乱,可以通过
OutputFormat 类的 createCompactFormat()方法或 createPrettyPrint()方法格式化输出,默认采
用createCompactFormat()方法,显示比较紧凑

 

默认的格式:

<?xml version="1.0" encoding="UTF-8"?>
<books><!--This is a test for dom4j,the goal is just for learn the base use dom4j --><book version="1.0"><title>Think In Java 0</title><author>Jay Chang0<name pastUsedName="Jay"/></author><publisher>Tsing Hua</publisher></book><book version="1.0"><title>Think In Java 1</title><author>Jay Chang1<name pastUsedName="Jay"/></author><publisher>Tsing Hua</publisher></book><book version="1.0"><title>Think In Java 2</title><author>Jay Chang2<name pastUsedName="Jay"/></author><publisher>Tsing Hua</publisher></book></books>
 

 

如果采用createPrettyPrint()的话,xml文档格式会比较美观

      OutputFormat format = OutputFormat.createPrettyPrint();
      writer = new XMLWriter(new FileWriter(newXMLFile), format);
      writer.write(xmlDocument);

 

即标题 2中列出的XML文档的那个格式,看上去比较舒服!

 

 

 

4  修改XML文档

 

      该方法演示了对XML文档的三个操作:

      1) 将所有version(版本信息)为1.0书的版本信息全改为1.1

      2) 将所有的publiser(出版社)为Tsing Hua书的出版社改为Peking University

      3) 将title(书名)为Think In Java 1书的title元素删掉

 

/**
   * 修改XML文档,操作又修改元素属性,修改元素文本值,向元素添加子元素,删除元素
   * 
   * @param filePath 需要读入的XML文档路径及文件名
   * @param newFilePath 修改后XML文档存储路径及文件名(如D:\\dom4j_example\\books_modified.xml)
   * @return ret 操作成功返回0,否则返回-1
   */
  public static int modifyXMLDocument(String filePath, String newFilePath) {
    SAXReader reader = new SAXReader();
    int ret = -1;
    XMLWriter writer = null;
    try {
      Document xmlDocument = reader.read(new File(filePath));
      // 修改内容1:将所有书本的版本属性改为1.1
      List versionList = xmlDocument.selectNodes("books/book/@version");
      Iterator verAttIt = versionList.iterator();
      while (verAttIt.hasNext()) {
        Attribute attributeVersion = (Attribute) verAttIt.next();
        if ("1.0".equals(attributeVersion.getValue()))
          attributeVersion.setValue("1.1");
      }

      // 修改内容2:将出版社改为Peking,并增加日期元素,文本值为2010-03-22
      List publishList = xmlDocument.selectNodes("books/book/publisher");
      Iterator pubEleIt = publishList.iterator();
      while (pubEleIt.hasNext()) {
        Element pubElement = (Element) pubEleIt.next();
        if ("Tsing Hua".equals(pubElement.getText())) {
          pubElement.setText("Peking University");
          Element pubTime = pubElement.addElement("publishTime");
          pubTime.setText("2010-03-22");
        }
      }

      // 修改内容3:将title为Think In Java 1的元素删除掉
      List bookList = xmlDocument.selectNodes("books/book");
      Iterator bookIt = bookList.iterator();
      while (bookIt.hasNext()) {
        Element bookElement = (Element) bookIt.next();
        Iterator titleIt = bookElement.elementIterator("title");
        while (titleIt.hasNext()) {
          Element titleElement = (Element) titleIt.next();
          if ("Think In Java 1".equals(titleElement.getText())) {
            bookElement.remove(titleElement);
          }
        }
      }

      // 将Document写到一个新的XML文件中
      int indexOfLastSeparator = newFilePath.lastIndexOf(File.separator);
      String directoryStr = newFilePath.substring(0, indexOfLastSeparator);
      File directory = new File(directoryStr);
      if (!directory.exists()) {
        directory.mkdirs();
      }
      String fileName = newFilePath.substring(indexOfLastSeparator + 1);
      File newXMLFile = new File(directory, fileName);
      if (!newXMLFile.exists()) {
        newXMLFile.createNewFile();
      }
      OutputFormat format = OutputFormat.createPrettyPrint();
      writer = new XMLWriter(new FileWriter(newXMLFile), format);
      writer.write(xmlDocument);
      ret = 0;
    } catch (DocumentException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (writer != null)
        try {
          writer.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
    }
    return ret;
  }
 

 

说明:
List list = document.selectNodes("/books/book/@version" );

所有book元素的versino列表
list = document.selectNodes("/books/book");

所有book元素


上述代码通过xpath查找到相应内容。
 
通过setValue()、setText()修改节点内容。
 
通过remove()删除节点或属性。

 

 

5  完整代码

 

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jParse {
    /**
     * 创建一个XML文档文件名及存储路径由filePath指定(如"D:\\dom4j_example\\books.xml")
     * 
     * @param filePath 文件存储路径及文件名
     * @return ret 操作成功返回0,否则返回-1
     */
    public static int createXMLDocument(String filePath) {
      Document xmlDocument = DocumentHelper.createDocument();
      // 可以通过OutputFormat来设置
      // xmlDocument.setXMLEncoding("UTF-8");
      Element booksElement = xmlDocument.addElement("books");
      xmlDocument.setRootElement(booksElement);
      //添加一注释
      booksElement
          .addComment("This is a test for dom4j,the goal is just for learn the base use dom4j ");
      //向books元素添加3个book元素
      for (int i = 0; i < 3; i++) {
        Element bookOne = booksElement.addElement("book");
        bookOne.addAttribute("version", "1.0");
        Element bookOneTitle = bookOne.addElement("title");
        bookOneTitle.setText("Think In Java " + i);
        Element bookOneAuthor = bookOne.addElement("author");
        bookOneAuthor.setText("Jay Chang" + i);
        Element bookOneAuthorName = bookOneAuthor.addElement("name");
        bookOneAuthorName.addAttribute("pastUsedName", "Jay");
        Element publish = bookOne.addElement("publisher");
        publish.setText("Tsing Hua");
      }
      int ret = -1;
      XMLWriter writer = null;
      try {
        int indexOfLastSeparator = filePath.lastIndexOf(File.separator);
        String directoryStr = filePath.substring(0, indexOfLastSeparator);
        File directory = new File(directoryStr);
        if (!directory.exists()) {
          System.out.println(directory);
          directory.mkdirs();
        }
        String fileName = filePath.substring(indexOfLastSeparator + 1);
        File xmlFile = new File(directory, fileName);
        if (!xmlFile.exists()) {
          System.out.println(xmlFile);
          xmlFile.createNewFile();
        }
        //OutputFormat format = OutputFormat.createPrettyPrint();
        //format.setEncoding("GBK");
        writer = new XMLWriter(new FileWriter(xmlFile));
        writer.write(xmlDocument);
        ret = 0;
      } catch (IOException e) {
        e.printStackTrace();
      } finally {
        if (writer != null)
          try {
            writer.close();
          } catch (IOException e) {
            e.printStackTrace();
          }
      }
      return ret;
    }

  /**
   * 修改XML文档,操作又修改元素属性,修改元素文本值,向元素添加子元素,删除元素
   * 
   * @param filePath 需要读入的XML文档路径及文件名
   * @param newFilePath 修改后XML文档存储路径及文件名(如D:\\dom4j_example\\books_modified.xml)
   * @return ret 操作成功返回0,否则返回-1
   */
  public static int modifyXMLDocument(String filePath, String newFilePath) {
    SAXReader reader = new SAXReader();
    int ret = -1;
    XMLWriter writer = null;
    try {
      Document xmlDocument = reader.read(new File(filePath));
      // 修改内容1:将所有书本的版本属性改为1.1
      List versionList = xmlDocument.selectNodes("books/book/@version");
      Iterator verAttIt = versionList.iterator();
      while (verAttIt.hasNext()) {
        Attribute attributeVersion = (Attribute) verAttIt.next();
        if ("1.0".equals(attributeVersion.getValue()))
          attributeVersion.setValue("1.1");
      }

      // 修改内容2:将出版社改为Peking,并增加日期元素,文本值为2010-03-22
      List publishList = xmlDocument.selectNodes("books/book/publisher");
      Iterator pubEleIt = publishList.iterator();
      while (pubEleIt.hasNext()) {
        Element pubElement = (Element) pubEleIt.next();
        if ("Tsing Hua".equals(pubElement.getText())) {
          pubElement.setText("Peking University");
          Element pubTime = pubElement.addElement("publishTime");
          pubTime.setText("2010-03-22");
        }
      }

      // 修改内容3:将title为Think In Java 1的元素删除掉
      List bookList = xmlDocument.selectNodes("books/book");
      Iterator bookIt = bookList.iterator();
      while (bookIt.hasNext()) {
        Element bookElement = (Element) bookIt.next();
        Iterator titleIt = bookElement.elementIterator("title");
        while (titleIt.hasNext()) {
          Element titleElement = (Element) titleIt.next();
          if ("Think In Java 1".equals(titleElement.getText())) {
            bookElement.remove(titleElement);
          }
        }
      }

      // 将Document写到一个新的XML文件中
      int indexOfLastSeparator = newFilePath.lastIndexOf(File.separator);
      String directoryStr = newFilePath.substring(0, indexOfLastSeparator);
      File directory = new File(directoryStr);
      if (!directory.exists()) {
        directory.mkdirs();
      }
      String fileName = newFilePath.substring(indexOfLastSeparator + 1);
      File newXMLFile = new File(directory, fileName);
      if (!newXMLFile.exists()) {
        newXMLFile.createNewFile();
      }
      OutputFormat format = OutputFormat.createPrettyPrint();
      writer = new XMLWriter(new FileWriter(newXMLFile), format);
      writer.write(xmlDocument);
      ret = 0;
    } catch (DocumentException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (writer != null)
        try {
          writer.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
    }
    return ret;
  }

  public static void main(String[] args) {
    System.out
        .println(createXMLDocument("f:\\Dom4j_Learn\\example1\\books.xml"));
    System.out.println(modifyXMLDocument(
        "F:\\Dom4j_Learn\\example1\\books.xml",
        "F:\\Dom4j_Learn\\example1\\books_modified.xml"));
  }
}
 

 

0
0
分享到:
评论

相关推荐

    利用Dom4j生成XML和解析XML

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

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

    Dom4J作为一款优秀的Java XML API,以其简洁、高效的特点,在生成、解析和操作XML文档方面表现突出。本文将深入探讨如何使用Dom4J库来创建XML文档,包括初始化文档、添加元素、设置属性、插入文本以及最终保存文档至...

    dom4j解析xml详解

    ### DOM4J解析XML详解 #### 一、DOM4J简介与特性 DOM4J是一个由dom4j.org开发的开源XML解析包,专为Java平台设计,它不仅支持DOM、SAX和JAXP标准,还巧妙地融入了Java集合框架,使其成为Java开发者在处理XML数据时...

    dom4j解析及生成 xml代码收集

    解析XML文件后,DOM4J会构建一个`Document`对象树,你可以通过这个树来访问和操作XML的所有元素。 - **Element对象**:`Element`是XML文档中的节点,相当于HTML的`&lt;tag&gt;`。DOM4J提供了丰富的API来操作元素,如获取...

    dom4j解析xml文件的压缩包

    为了使用这个库,你需要将该jar包添加到项目的类路径中,然后就可以通过DOM4J提供的类和方法来解析和操作XML文件了。 总之,DOM4J是一个功能强大的XML处理库,无论是在小型项目还是大型系统中,都能发挥其优势,...

    Dom4j解析和生成XML文档

    DOM4J通过构建DOM树(Document Object Model)来解析XML。DOM模型是一种将XML文档转换为内存中对象树的表示方式。在DOM4J中,我们可以使用`DocumentBuilderFactory`和`DocumentBuilder`来创建`Document`对象,然后...

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

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

    dom4j 解析写入xml

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

    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`中的代码...

    XML解析技术DOM4J解析

    DOM4J提供了对XML Schema的全面支持,允许开发者在解析XML文档时进行严格的模式验证,确保数据的准确性和一致性。这对于企业级应用尤为重要,因为它们往往需要处理大量的结构化数据。 **3. 基于事件的处理** 对于...

    dom4j API 用于解析XML的java库

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

    dom4j读取XML,解析XML简单示例

    首先,`XMLTest.java`是一个包含DOM4J操作XML的代码实例。通常,这样的程序会包含以下步骤: 1. 引入DOM4J库:在Java项目中,你需要导入DOM4J的相关类,如`org.dom4j.Document`、`org.dom4j.DocumentHelper`等。这...

    dom4j解析xml,利用反射机制

    在这个项目中,我们利用DOM4J来解析XML文件,并通过Java的反射机制将解析出的信息存储到特定的类中。 首先,我们需要了解XML的基本概念。XML(Extensible Markup Language)是一种标记语言,常用于数据交换和结构化...

    DOM4J解析XML数据

    **DOM4J解析XML数据** DOM4J是一个强大的Java库,专门用于处理XML文档,它提供了灵活且高效的方式来解析、创建、修改XML内容。在Java世界中,XML处理有多种方式,如DOM、SAX、StAX等,而DOM4J因其易用性和功能丰富...

    dom4j生成XML文档及解析

    在这个场景中,我们将深入理解如何使用DOM4J来生成XML文档以及如何解析XML内容。 首先,生成XML文档涉及以下几个主要步骤: 1. **创建Document对象**:`DocumentHelper.createDocument()`方法用于创建一个新的XML...

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

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

Global site tag (gtag.js) - Google Analytics