dom4j学习总结

1.XML解析技术

(1)dom:Document Object Model,文档对象模型,W3C推荐

(2)sax:Simple API for XML,XML社区的实际标准(有点像OSI和TCP/IP的关系)

 

2.dom4j简介

简单、灵活的开放源代码的库,是一个非常优秀的Java开发的 XML API。dom4j使用接口和抽象基类,因此比jdom更灵活。Hibernate中也采用dom4j。

 

3.下载和配置dom4j

下载地址:http://sourceforge.net/projects/dom4j/

导入dom4j-1.6.1.jar到项目中(build path)

查阅dom4j的相关API文档

 

4.DEMO

假设有如下的car.xml文件

[html] view plaincopyprint?

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <carlist>
  3.   <car>
  4.     <brand produceTime=”2010″>Audi</brand>
  5.     <place>Beijing</place>
  6.     <price>30</price>>
  7.   </car>
  8.   <car>
  9.     <brand produceTime=”2011″>toyota</brand>
  10.     <place>Guangzhou</place>>
  11.     <price>60</price>
  12.   </car>
  13. </carlist>

 

现在利用dom4j来解析该xml文档

[java] view plaincopyprint?

  1. package web.java.xml.dom4j;
  2. import java.io.File;
  3. import java.util.List;
  4. import org.dom4j.Document;
  5. import org.dom4j.DocumentException;
  6. import org.dom4j.Element;
  7. import org.dom4j.io.SAXReader;
  8. /**
  9.  * 基于dom4j解析XML文件
  10.  * @author well
  11.  *
  12.  */
  13. public class Demo1 {
  14.     public static void main(String[] args) throws DocumentException {
  15.         //创建dom4j解析器
  16.         SAXReader saxReader = new SAXReader();
  17.         //加载需要解析的XML文件
  18.         Document doc = saxReader.read(new File(“src/web/java/xml/dom4j/car.xml”));
  19.         //取得根元素
  20.         Element rootElement = doc.getRootElement();
  21.         //显示根元素的名称
  22.         System.out.println(rootElement.getName());
  23.         //取得根元素下的子元素
  24.         List<Element> elementList = rootElement.elements();
  25.         System.out.println(“共有”+elementList.size()+”个子元素”);
  26.         for (Element e : elementList) {
  27.             System.out.println(“brand:”+e.elementText(“brand”));
  28.              System.out.println(“place:”+e.elementText(“place”));
  29.             System.out.println(“==============”);
  30.         }
  31.     }
  32. }

在上面的例子中,首先解析XML文件得到根元素,其次通过根元素得到下面的子元素。
(Doucument是一个接口,具体参见dom4j的api文档)

通常调用Document对象下面的getRootElement()方法得到XML文档的根元素

有三种方式获得Document对象:

(1)读取XML文件,获得document对象(解析)

[java] view plaincopyprint?

  1. SAXReader saxReader = new SAXReader();
  2. //加载需要解析的XML文件
  3. Document doc = saxReader.read(new File(“src/web/java/xml/dom4j/car.xml”));

(2)解析XML形式的文本,得到document对象

[java] view plaincopyprint?

  1. String text = “<car>Jeep</car>”;
  2. Document document = DocumentHelper.parseText(text);

(3)主动创建document对象(创建)

[java] view plaincopyprint?

  1. Document document = DocumentHandler.createDocument();
  2. Element root = document.addElement(“car”);

5.对XML文件中的指定元素做C.U.D操作

(这里以car.xml为例)

[java] view plaincopyprint?

  1. package web.java.xml.dom4j;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.OutputStream;
  7. import java.io.UnsupportedEncodingException;
  8. import org.dom4j.Document;
  9. import org.dom4j.DocumentException;
  10. import org.dom4j.Element;
  11. import org.dom4j.io.OutputFormat;
  12. import org.dom4j.io.SAXReader;
  13. import org.dom4j.io.XMLWriter;
  14. import org.junit.Test;
  15. /**
  16.  * 使用dom4j操作XML文件的C.U.D(Create\Update\Delete)
  17.  *
  18.  * @author well
  19.  *
  20.  */
  21. public class Demo2 {
  22.     /**
  23.      * 读取XML文件的公共方法
  24.      *
  25.      * @throws DocumentException
  26.      */
  27.     private Document getDocument() throws DocumentException {
  28.         File file = new File(“src/web/java/xml/dom4j/car.xml”);
  29.         SAXReader saxReader = new SAXReader();
  30.         Document document = saxReader.read(file);
  31.         return document;
  32.     }
  33.     /**
  34.      * 将文件写入XML文件
  35.      *
  36.      * @param document
  37.      * @throws FileNotFoundException
  38.      * @throws UnsupportedEncodingException
  39.      * @throws IOException
  40.      */
  41.     private void write2XML(Document document) throws FileNotFoundException,
  42.             UnsupportedEncodingException, IOException {
  43.         // 输出格式良好的
  44.         OutputFormat oformat = OutputFormat.createPrettyPrint();
  45.         OutputStream os = new FileOutputStream(“src/web/java/xml/dom4j/car.xml”);
  46.         XMLWriter xmlWriter = new XMLWriter(os, oformat);
  47.         xmlWriter.write(document);
  48.         xmlWriter.close();
  49.     }
  50.     /**
  51.      * 在XML文件中新建新的元素(根下面的子元素)
  52.      *
  53.      * @throws Exception
  54.      */
  55.     @Test
  56.     public void create() throws Exception {
  57.         // 获取Document对象
  58.         Document document = getDocument();
  59.         Element rootElement = document.getRootElement();
  60.         // 获取文件中的第一个元素
  61.         Element firstCar = (Element) rootElement.elements().get(0);
  62.         firstCar.addElement(“price”).setText(“40w”);
  63.         write2XML(document);
  64.     }
  65.     /**
  66.      * 更新XML文件中指定元素的值
  67.      *
  68.      * @throws Exception
  69.      */
  70.     @Test
  71.     public void update() throws Exception {
  72.         Document doc = getDocument();
  73.         Element rootElement = doc.getRootElement();
  74.         Element firstCar = (Element) rootElement.elements().get(0);
  75.         firstCar.element(“price”).setText(“50”);
  76.         write2XML(doc);
  77.     }
  78.     /**
  79.      * 删除XML文件中的指定元素
  80.      * @throws Exception
  81.      */
  82.     @Test
  83.     public void delete() throws Exception {
  84.         Document doc = getDocument();
  85.         Element rootElement = doc.getRootElement();
  86.         Element firstCar = (Element) rootElement.elements().get(0);
  87.         Element firstCarPrice = (Element) firstCar.element(“price”);
  88.         //firstCar.remove(firstCarPrice);
  89.         firstCarPrice.getParent().remove(firstCarPrice);
  90.         write2XML(doc);
  91.     }
  92. }

在上面的例子中,将读取创建document对象 和 写入XML文件 的代码抽取出来,因为在每一个方法中这些代码是重复的。

 

标签