使用dom4j解析xml文件

 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     
View Code

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 }
View Code

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 }
View Code

可以看到控制台打印出:

根节点名称: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

 

 

posted @ 2013-08-17 20:51  静静的码农  阅读(4818)  评论(0编辑  收藏  举报