1. 概述
解析XML文档方面有不少的方法,也有不少的工具包可用,这里介绍的是来自Apache Jakarta的Digester,使用其解析XML文件非常方便而不需要过多的关心底层的具体解析过程。
Digester最早出现在Struts中,后来随着Struts的发展以及其的公用性而被提到commens中独自立项,其底层实现的是SAX解析。当前版本为:1.5
2. 正文
1. 安装与配置
使用Digester需要如下几个软件包:
Digester ,BeanUtils, Collections, Commens-Logging,还有一个遵循SAX(Simple API for XML)2.0或JAXP(Java API for XML Parsing) 1.1规范的XML解析器,如Xerces。相关下载地址见附录。如果需要使用log4j做为日志输出,则亦请下载之。
将下载来的zip包解压,并将其中的jar文件拷贝到你的工程文件的lib目录中,并在工程classpath中包含上述jar文件的路径。
2. XML文件
<?
xml version="1.0" encoding="UTF-8"
?>
< root >
<!-- 这里是注释 -->
< events >
< event >
< date >
<![CDATA[ 2007年5月10日 ]]>
</ date >
< address >
<![CDATA[ 江东影城 ]]>
</ address >
< person >
<![CDATA[ person1|person2|person3 ]]>
</ person >
< title >
<![CDATA[ 《阪神×巨人戦》 ]]>
</ title >
</ event >
< event >
< date >
<![CDATA[ 2007年5月11日 ]]>
</ date >
< address >
<![CDATA[ 江南水庄 ]]>
</ address >
< person >
<![CDATA[ person1|person2|person3 ]]>
</ person >
< title >
<![CDATA[ 吃鱼苗 ]]>
</ title >
</ event >
</ events >
< configs >
< config key ="root.configs.config1" value ="value1" />
< config key ="root.configs.config2" value ="value2" />
< config key ="root.configs.config3" value ="value3" />
</ configs >
</ root >
< root >
<!-- 这里是注释 -->
< events >
< event >
< date >
<![CDATA[ 2007年5月10日 ]]>
</ date >
< address >
<![CDATA[ 江东影城 ]]>
</ address >
< person >
<![CDATA[ person1|person2|person3 ]]>
</ person >
< title >
<![CDATA[ 《阪神×巨人戦》 ]]>
</ title >
</ event >
< event >
< date >
<![CDATA[ 2007年5月11日 ]]>
</ date >
< address >
<![CDATA[ 江南水庄 ]]>
</ address >
< person >
<![CDATA[ person1|person2|person3 ]]>
</ person >
< title >
<![CDATA[ 吃鱼苗 ]]>
</ title >
</ event >
</ events >
< configs >
< config key ="root.configs.config1" value ="value1" />
< config key ="root.configs.config2" value ="value2" />
< config key ="root.configs.config3" value ="value3" />
</ configs >
</ root >
3. 解析XML文档
Digester的使用相当简单,请参看如下的DigesterTest类中的注释
package
test;
import java.io.IOException;
import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;
/** */ /**
* DigesterTest<br>
* 用Digester简化XML配置文件处理<br>
* 2007-6-7 ver1.00 Yusx<br>
*
* @author Yusx
* @version 1.00
*/
public class DigesterTest {
private String configFile;
/** *//**
* 设置XML文件路径
* @param configFile 路径
*/
public void setConfigFile(String configFile) {
this.configFile = configFile;
}
/** *//**
* 解析XML文件
* @throws IOException
* @throws SAXException
*/
public void run() throws IOException, SAXException {
// 新建Digester实例
Digester digester = new Digester();
// 将本实例放入Digester处理堆栈
digester.push(this);
/**//*
* root/events/event: XML文件中的节点路径
* addEventInfo: 遇到到该节点时执行的方法
* addEventInfo 本类的一个方法
* 4 调用 addEventInfo 方法需要传入4个参数
*/
digester.addCallMethod("root/events/event", "addEventInfo", 4);
/**//*
* 逐个设置 addEventInfo 方法的参数,下标从0开始
* 参数的值为对应节点 (root/events/event/date) 的值
*/
digester.addCallParam("root/events/event/date", 0);
digester.addCallParam("root/events/event/address", 1);
digester.addCallParam("root/events/event/person", 2);
digester.addCallParam("root/events/event/title", 3);
// 开始解析XML文件
digester.parse(this.configFile);
}// end run()
/** *//**
* 对XML参数进行处理
* 本方法仅将XML文件中的内容简单输出,实际应用中可以将获得的信息进行进一步的处理。
* @param date 时间
* @param address 地点
* @param person 人物
* @param title 事件title
*/
public void addEventInfo(String date, String address, String person, String title) {
System.out.println("person=" + person + ",date=" + date
+ ",address=" + address + ",title=" + title);
}// end addEventInfo()
/** *//**
* 对XML参数进行处理
* 本方法仅将XML文件中的内容简单输出,实际应用中可以将获得的信息进行进一步的处理。
* @param attr Attribute 对象
*/
public void addAttributeInfo(Attribute attr) {
// 调用 Attribute 对象的 toString() 方法
System.out.println(attr);
}// end addAttributeInfo()
/** *//**
* @param args
*/
public static void main(String[] args) {
DigesterTest dt = new DigesterTest();
// 设置XML文件路径
dt.setConfigFile("DigesterTest.xml");
try {
dt.run();
dt = null;
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
//-----------------------------------------------------------------
// 演示另一种解析方法
Digester digester = new Digester();
// 生成本类的实例
digester.addObjectCreate("root/configs/config", DigesterTest.class);
// 生成 Attribute 对象实例,对XML文件中root/configs/config节点的属性进行封装
digester.addObjectCreate("root/configs/config", Attribute.class);
/**//*
* 获取节点的属性值,并将其存入Attribute实例
* key 对应节点的属性名
* name 对应Attribute实例的属性名
*/
digester.addSetProperties("root/configs/config", "key", "name");
digester.addSetProperties("root/configs/config", "value", "value");
// 定义解析到对应节点(root/configs/config)时,调用本实例的 addAttributeInfo 方法
digester.addSetNext("root/configs/config", "addAttributeInfo");
try {
// 开始解析XML文件
digester.parse("DigesterTest.xml");
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}// end main()
}
import java.io.IOException;
import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;
/** */ /**
* DigesterTest<br>
* 用Digester简化XML配置文件处理<br>
* 2007-6-7 ver1.00 Yusx<br>
*
* @author Yusx
* @version 1.00
*/
public class DigesterTest {
private String configFile;
/** *//**
* 设置XML文件路径
* @param configFile 路径
*/
public void setConfigFile(String configFile) {
this.configFile = configFile;
}
/** *//**
* 解析XML文件
* @throws IOException
* @throws SAXException
*/
public void run() throws IOException, SAXException {
// 新建Digester实例
Digester digester = new Digester();
// 将本实例放入Digester处理堆栈
digester.push(this);
/**//*
* root/events/event: XML文件中的节点路径
* addEventInfo: 遇到到该节点时执行的方法
* addEventInfo 本类的一个方法
* 4 调用 addEventInfo 方法需要传入4个参数
*/
digester.addCallMethod("root/events/event", "addEventInfo", 4);
/**//*
* 逐个设置 addEventInfo 方法的参数,下标从0开始
* 参数的值为对应节点 (root/events/event/date) 的值
*/
digester.addCallParam("root/events/event/date", 0);
digester.addCallParam("root/events/event/address", 1);
digester.addCallParam("root/events/event/person", 2);
digester.addCallParam("root/events/event/title", 3);
// 开始解析XML文件
digester.parse(this.configFile);
}// end run()
/** *//**
* 对XML参数进行处理
* 本方法仅将XML文件中的内容简单输出,实际应用中可以将获得的信息进行进一步的处理。
* @param date 时间
* @param address 地点
* @param person 人物
* @param title 事件title
*/
public void addEventInfo(String date, String address, String person, String title) {
System.out.println("person=" + person + ",date=" + date
+ ",address=" + address + ",title=" + title);
}// end addEventInfo()
/** *//**
* 对XML参数进行处理
* 本方法仅将XML文件中的内容简单输出,实际应用中可以将获得的信息进行进一步的处理。
* @param attr Attribute 对象
*/
public void addAttributeInfo(Attribute attr) {
// 调用 Attribute 对象的 toString() 方法
System.out.println(attr);
}// end addAttributeInfo()
/** *//**
* @param args
*/
public static void main(String[] args) {
DigesterTest dt = new DigesterTest();
// 设置XML文件路径
dt.setConfigFile("DigesterTest.xml");
try {
dt.run();
dt = null;
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
//-----------------------------------------------------------------
// 演示另一种解析方法
Digester digester = new Digester();
// 生成本类的实例
digester.addObjectCreate("root/configs/config", DigesterTest.class);
// 生成 Attribute 对象实例,对XML文件中root/configs/config节点的属性进行封装
digester.addObjectCreate("root/configs/config", Attribute.class);
/**//*
* 获取节点的属性值,并将其存入Attribute实例
* key 对应节点的属性名
* name 对应Attribute实例的属性名
*/
digester.addSetProperties("root/configs/config", "key", "name");
digester.addSetProperties("root/configs/config", "value", "value");
// 定义解析到对应节点(root/configs/config)时,调用本实例的 addAttributeInfo 方法
digester.addSetNext("root/configs/config", "addAttributeInfo");
try {
// 开始解析XML文件
digester.parse("DigesterTest.xml");
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}// end main()
}
附Attribute.java的代码
package
test;
public class Attribute {
private String name = null;
private String value = null;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String toString() {
return "name=" + this.name + " value=" + this.value;
}
}
public class Attribute {
private String name = null;
private String value = null;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String toString() {
return "name=" + this.name + " value=" + this.value;
}
}
Digester,BeanUtils,Collections,Commens-logging下载地址:
http://jakarta.apache.org/commons/digester/