利用dom4j对xml的简单操作

  • 背景

      以前常用jdom,后来无意的试了试dom4j,发现真是不错,接口符合dom规范。

      Document Object Model (DOM) Level 1 Specification
      Document Object Model (DOM) Level 2 Specification
      Document Object Model (DOM) Level 3 Specification

  • 准备

   Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。

     http://www.dom4j.org/guide.html

     jaxen是一个用Java开发的XPath 引擎,支持JDOM, dom4j。

    http://jaxen.org/

  • 代码及说明

package demo;

import java.io.File;
import java.io.FileWriter;

import java.util.Iterator;
import java.util.List;

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

/**
 * <p>Title: dom4j的测试类</p>
 *
 * <p>Description: 包括创建一个xml文档,修改xml文档,格式化xml文档</p>
 *
 * <p>IDE: JBuilder 2006</p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: </p>
 *
 * @author 李彦宁
 * @version 1.0
 */
public class XMLDemo {

  public XMLDemo() {
  }

  /**
   * 建立一个XML文档,文档名由输入属性决定
   * @param fileName需建立的文件名
   * @return 返回操作结果, false表失败, true表成功
   */

  public boolean createXMLFile(String fileName) {

    /** 返回操作结果, false表失败, true表成功 */

    boolean returnValue = false;

    /** 建立document对象 */

    Document document = DocumentHelper.createDocument();

    /** 建立XML文档的根books */

    Element booksElement = document.addElement("books");

    /** 加入一行注释 */

    booksElement.addComment("This is a test for dom4j, lyn, 2006-4-26");

    /** 加入第一个book节点 */

    Element bookElement = booksElement.addElement("book");

    /** 加入show属性内容 */

    bookElement.addAttribute("show", "yes");

    /** 加入title节点 */

    Element titleElement = bookElement.addElement("title");

    /** 为title设置内容 */

    titleElement.setText("AJAX In Action");

    /** 类似的完成后两个book */

    bookElement = booksElement.addElement("book");

    bookElement.addAttribute("show", "yes");

    titleElement = bookElement.addElement("title");

    titleElement.setText("AspectJ in Action");

    bookElement = booksElement.addElement("book");

    bookElement.addAttribute("show", "no");

    titleElement = bookElement.addElement("title");

    titleElement.setText("Lucene in Action");

    /** 加入owner节点 */

    Element ownerElement = booksElement.addElement("owner");

    ownerElement.setText("O'Reilly");

    try {

      /** 将document中的内容写入文件中 */

      XMLWriter writer = new XMLWriter(new FileWriter(new File(fileName)));

      writer.write(document);

      writer.close();

      /** 执行成功,需返回true */

      returnValue = true;

    }
    catch (Exception e) {

      e.printStackTrace();

    }

    return returnValue;
  }

  /**
   * 修改XML文件中内容,并另存为一个新文件

   * 重点掌握dom4j中如何添加节点,修改节点,删除节点

   * @param srcFileName修改对象文件

   * @param distFileName修改后另存为该文件

   * @return 返回操作结果, false表失败, true表成功

   */

 public boolean modifyXMLFile(String srcFileName, String distFileName) {

    boolean returnValue = false;

    try {

      SAXReader saxReader = new SAXReader();

      Document document = saxReader.read(new File(srcFileName));

      /** 修改内容之一: 如果book节点中show属性的内容为yes,则修改成no */

      /** 先用xpath查找对象 */

      List list = document.selectNodes("/books/book/@show");

      Iterator iter = list.iterator();

      while (iter.hasNext()) {

        Attribute attribute = (Attribute) iter.next();

        if (attribute.getValue().equals("yes")) {

          attribute.setValue("no");

        }

      }

      /**
       * 修改内容之二: 把owner项内容改为Tshinghua

       * 并在owner节点中加入date节点,date节点的内容为2004-09-11,还为date节点添加一个属性type

       */

      list = document.selectNodes("/books/owner");

      iter = list.iterator();

      if (iter.hasNext()) {

        Element ownerElement = (Element) iter.next();

        ownerElement.setText("Tshinghua");

        Element dateElement = ownerElement.addElement("date");

        dateElement.setText("2006-04-26");

        dateElement.addAttribute("type", "Gregorian calendar");

      }

      /** 修改内容之三: 若title内容为AJAX In Action,则删除该节点 */

      list = document.selectNodes("/books/book");

      iter = list.iterator();

      while (iter.hasNext()) {

        Element bookElement = (Element) iter.next();

        Iterator iterator = bookElement.elementIterator("title");

        while (iterator.hasNext()) {

          Element titleElement = (Element) iterator.next();

          if (titleElement.getText().equals("AJAX In Action")) {

            bookElement.remove(titleElement);

          }

        }

      }

      try {

        /** 将document中的内容写入文件中 */

        XMLWriter writer = new XMLWriter(new FileWriter(new File(distFileName)));

        writer.write(document);

        writer.close();

        /** 执行成功,需返回true */

        returnValue = true;

      }
      catch (Exception ex) {

        ex.printStackTrace();

      }

    }
    catch (Exception ex) {

      ex.printStackTrace();

    }

    return returnValue;

  }

  /**
   * 格式化XML文档,并解决中文问题

   * @param fileName文件名称

   * @return 返回值

   */

  public boolean formatXMLFile(String fileName) {

    boolean returnValue = false;

    try {

      SAXReader saxReader = new SAXReader();

      Document document = saxReader.read(new File(fileName));

      XMLWriter writer = null;

      /** 格式化输出,类型IE浏览一样 */

      OutputFormat format = OutputFormat.createPrettyPrint();

      /** 指定XML编码 */

      format.setEncoding("GBK");

      writer = new XMLWriter(new FileWriter(new File(fileName)), format);

      writer.write(document);

      writer.close();

      /** 执行成功,需返回true */

      returnValue = true;

    }
    catch (Exception ex) {

      ex.printStackTrace();

    }

    return returnValue;

  }

  public static void main(String[] args) {
    XMLDemo dom4jdemo = new XMLDemo();
   
    String tmpFile = "tmp.xml";
    String dataFile = "data.xml";
   
    if(!dom4jdemo.createXMLFile(tmpFile)){
      System.out.println("Error in creatXMLFile");
      return;
    }
   
    if(!dom4jdemo.modifyXMLFile(tmpFile,dataFile)){
      System.out.println("Error in ModifyXMLFile");
      return;
    }
   
    if(!dom4jdemo.formatXMLFile(dataFile)){
      System.out.println("Error in formatXMLFile");
      return;
    }
   
  }
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值