DOM4J
與利用DOM、SAX、JAXP機制來解析xml相比,DOM4J 表現更優秀,具有性能優異、功能強大和極端易用使用的特點,只要懂得DOM基本概念,就可以通過dom4j的api文檔來解析xml。dom4j是一套開源的api。實際項目中,往往選擇dom4j來作為解析xml的利器。
先來看看dom4j中對應XML的DOM樹建立的繼承關系
針對於XML標准定義,對應於圖中列出的內容,dom4j提供了以下實現:
同時,dom4j的NodeType枚舉實現了XML規范中定義的node類型。如此可以在遍歷xml文檔的時候通過常量來判斷節點類型了。
常用API
class org.dom4j.io.SAXReader
- read 提供多種讀取xml文件的方式,返回一個Domcument對象
interface org.dom4j.Document
- iterator 使用此法獲取node
- getRootElement 獲取根節點
interface org.dom4j.Node
- getName 獲取node名字,例如獲取根節點名稱為bookstore
- getNodeType 獲取node類型常量值,例如獲取到bookstore類型為1——Element
- getNodeTypeName 獲取node類型名稱,例如獲取到的bookstore類型名稱為Element
interface org.dom4j.Element
- attributes 返回該元素的屬性列表
- attributeValue 根據傳入的屬性名獲取屬性值
- elementIterator 返回包含子元素的迭代器
- elements 返回包含子元素的列表
interface org.dom4j.Attribute
- getName 獲取屬性名
- getValue 獲取屬性值
interface org.dom4j.Text
- getText 獲取Text節點值
interface org.dom4j.CDATA
- getText 獲取CDATA Section值
interface org.dom4j.Comment
- getText 獲取注釋
解析實例:
1.先准備好一個xml文件,本文解析的是一個spring的配置文件

1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 3 "http://www.springframework.org/dtd/spring-beans.dtd"> 4 5 <beans> 6 <bean id="productManager" class="com.yangyang.manager.product.impl.ProductManagerImpl"> 7 <property name="productDao" ref="productDao"></property> 8 <property name="soDao" ref="soDao"></property> 9 </bean> 10 <bean id="contractManager" class="com.yangyang.manager.product.impl.ContractManagerImpl" autowire="byName"/> 11 </beans> 12
2.第二步,添加dom4j的jar包到工程中,本文使用的jar版本是dom4j-1.6.1.jar
3.第三補,編寫解析xml文件的工具類

1 package com.yangyang; 2 3 import java.net.URL; 4 import java.util.Iterator; 5 6 import org.dom4j.Attribute; 7 import org.dom4j.Document; 8 import org.dom4j.Element; 9 import org.dom4j.io.SAXReader; 10 11 public class XmlParseUtil { 12 13 @SuppressWarnings("rawtypes") 14 public static void parseXml(String xmlPath){ 15 SAXReader saxReader=new SAXReader(); 16 Document document=null; 17 try { 18 document=saxReader.read(xmlPath); 19 //獲取根節點 20 Element elementRoot=document.getRootElement(); 21 System.out.println("根節點名稱:"+elementRoot.getName()); 22 //遍歷根節點下面的節點 23 for(Iterator elementIterator=elementRoot.elementIterator();elementIterator.hasNext();){ 24 Element element=(Element)elementIterator.next(); 25 //獲取節點的信息,,包括節點的名稱以及節點的屬性信息 26 System.out.println("節點:"+element.getName()); 27 for (Iterator attrIterator = element.attributeIterator(); attrIterator.hasNext();) { 28 Attribute attr=(Attribute)attrIterator.next(); 29 //節點的屬性信息 30 System.out.println("節點的屬性名稱為:"+attr.getName()+",值為:"+attr.getValue()); 31 32 } 33 //獲取節點下的子節點 34 for (Iterator subElementiterator = element.elementIterator(); subElementiterator.hasNext();) { 35 Element subElement=(Element)subElementiterator.next(); 36 //獲取子節點的信息,包括子節點的名稱以及子節點的屬性信息 37 System.out.println("子節點:"+subElement.getName()); 38 for (Iterator subElementAttrIterator = subElement.attributeIterator(); subElementAttrIterator.hasNext();) { 39 Attribute subElementAttr=(Attribute)subElementAttrIterator.next(); 40 //子節點的屬性信息 41 System.out.println("子節點的屬性名稱為:"+subElementAttr.getName()+",值為:"+subElementAttr.getValue()); 42 43 } 44 45 } 46 } 47 } catch (Exception e) { 48 } 49 } 50 }
4.編寫測試方法來測試該工具類:

1 package com.yangyang; 2 import java.io.File; 3 public class TestXmlParse { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 String xmlPath="src/com/yangyang/spring-service-product.xml"; 10 xmlPath=new File(xmlPath).getAbsolutePath(); 11 XmlParseUtil.parseXml(xmlPath); 12 } 13 14 }
可以看到控制台打印出:
根節點名稱:beans
節點:bean
節點的屬性名稱為:id,值為:productManager
節點的屬性名稱為:class,值為:com.yangyang.manager.product.impl.ProductManagerImpl
節點的屬性名稱為:lazy-init,值為:default
節點的屬性名稱為:autowire,值為:default
節點的屬性名稱為:dependency-check,值為:default
子節點:property
子節點的屬性名稱為:name,值為:productDao
子節點的屬性名稱為:ref,值為:productDao
子節點:property
子節點的屬性名稱為:name,值為:soDao
子節點的屬性名稱為:ref,值為:soDao
節點:bean
節點的屬性名稱為:id,值為:contractManager
節點的屬性名稱為:class,值為:com.yangyang.manager.product.impl.ContractManagerImpl
節點的屬性名稱為:autowire,值為:byName
節點的屬性名稱為:lazy-init,值為:default
節點的屬性名稱為:dependency-check,值為:default