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