首页 > 技术文章 > dom4j解析XML文件

LearnAndGet 2018-03-14 13:21 原文

一.简介

  dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。

二.使用方法

 1.导入必要jar包

  我这里导入的是dom4j-1.6.1.jar(可以百度搜索下载)

 2.使用dom4j写xml文件

  

 1 package Dom4j;
 2 
 3 import java.io.FileOutputStream;
 4 import java.io.FileWriter;
 5 
 6 import org.dom4j.Document;
 7 import org.dom4j.DocumentHelper;
 8 import org.dom4j.Element;
 9 import org.dom4j.io.OutputFormat;
10 import org.dom4j.io.XMLWriter;
11 
12 
13 public class dom4jTest1 {
14     public static void main(String args[]) throws Exception
15     {
16         //使用helper,创建文档
17         Document document = DocumentHelper.createDocument();
18         //创建节点book,并设置为根节点
19         Element element = DocumentHelper.createElement("book");
20         document.setRootElement(element);
21         /***********另外一种创建方式********/
22         //Element element2 = DocumentHelper.createElement("book");
23         //Document document2 = DocumentHelper.createDocument(element2);
24         /****************************/
25         //添加属性 
26         element.addAttribute("name", "Journey to the West");
27         //添加子节点,注意观察和属性的区别。
28         Element Author = element.addElement("Author");
29         Author.setText("WuChenEn");
30         Element Dynasty = element.addElement("dynasty");
31         Dynasty.setText("Ming");
32         
33         //输出到控制台
34         XMLWriter xmlWriter = new XMLWriter();
35         xmlWriter.write(document);
36         
37         //输出到文件
38         OutputFormat format = new OutputFormat("    ",true);  //设置缩进为2个空格,并且另起一行为true
39         XMLWriter xmlWriter2 = new XMLWriter(new FileOutputStream("books.xml"),format);
40         xmlWriter2.write(document);
41         
42         //另一种输出方式
43         XMLWriter xmlWriter3 = new XMLWriter(new FileWriter("books2.xml"),format);
44         xmlWriter3.write(document);
45         xmlWriter3.flush(); //或者close方法。如不添加则文件为空白
46     }
47 }

在运行之后,可以看到项目根目录生成了如下books.xml文件和books2.xml。

  

books.xml文件结构如下:

 

<?xml version="1.0" encoding="UTF-8"?>

<book name="Journey to the West">
    <Author>WuChenEn</Author>
    <dynasty>Ming</dynasty>
</book>

 

3.使用dom4j解析xml文件

  XML文件格式如下:

<?xml version="1.0" encoding="UTF-8"?> 
<books> 
   <book id="001"> 
      <title>Harry Potter</title> 
      <author>J K. Rowling</author> 
   </book> 
   <book id="002"> 
      <title>Learning XML</title> 
      <author>LearnAndGet</author> 
   </book> 
</books>

 解析过程:

 1 package Dom4j;
 2 
 3 import java.io.File;
 4 import java.util.List;
 5 
 6 import org.dom4j.Attribute;
 7 import org.dom4j.Document;
 8 import org.dom4j.DocumentException;
 9 import org.dom4j.Element;
10 import org.dom4j.io.SAXReader;
11 
12 public class dom4jTest2 {
13     public static void main(String args[]) throws Exception
14     {  
15         SAXReader reader = new SAXReader();   //
16         File file = new File("books2.xml"); 
17         Document document = reader.read(file);
18         Element root = document.getRootElement();
19         
20         List<Element> childElements = root.elements();
21         for(Element child : childElements)
22         {
23             //在未知属性名的情况下:
24             List<Attribute> attributeList = child.attributes();
25             for(Attribute attr : attributeList)
26             {
27                 System.out.println(attr.getName()+" : "+attr.getValue());
28             }
29             
30             /*若已知属性名,可使用以下方法
31              * system.out.println("id"+" : "+child.attributeValue("id"));
32              */
33             
34             //在未知子节点名的情况下:
35             List<Element> elementList = child.elements();
36             for(Element element : elementList)
37             {
38                 System.out.println(element.getName()+" : "+element.getText());
39             }
40             /*若已知子节点属性名,可使用以下方法
41              * System.out.println("title"+" : "+child.elementText("title"));
42              * System.out.println("author"+" : "+child.elementText("author"));
43              */
44         }
45     }
46 }

 可以看到控制台输出结果如下:

id : 001
title : Harry Potter
author : J K. Rowling
id : 002
title : Learning XML
author : LearnAndGet

  使用Iterator迭代器的方式来解析xml:

import java.io.File;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jTest {
 public static void main(String[] args) throws Exception {
  SAXReader reader = new SAXReader();
  Document document = reader.read(new File("books.xml"));
  Element root = document.getRootElement();

  Iterator it = root.elementIterator();
  while (it.hasNext()) {
   Element element = (Element) it.next();

   //未知属性名称情况下
   /*Iterator attrIt = element.attributeIterator();
   while (attrIt.hasNext()) {
    Attribute a  = (Attribute) attrIt.next();
    System.out.println(a.getValue());
   }*/

   //已知属性名称情况下
   System.out.println("id: " + element.attributeValue("id"));

   //未知元素名情况下
   /*Iterator eleIt = element.elementIterator();
   while (eleIt.hasNext()) {
    Element e = (Element) eleIt.next();
    System.out.println(e.getName() + ": " + e.getText());
   }
   System.out.println();*/

   //已知元素名情况下
   System.out.println("title: " + element.elementText("title"));
   System.out.println("author: " + element.elementText("author"));
   System.out.println();
  }
 }
}

 

推荐阅读