Posted on 2007-06-07 17:26
泰仔在线 阅读(4105)
评论(7) 编辑 收藏 所属分类:
Java 相关
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文件,示例使用DigesterTest.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>
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()
}
附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;
}
}
Digester,BeanUtils,Collections,Commens-logging下载地址:
http://jakarta.apache.org/commons/digester/