使用Jakarta-commons-Digester解析xml文件

一:说明
Digester是jakarta commons里面的一个包,最早运用于Struts中xml文件的解析.后来独立出来
归到commons下面.主要的开发人员是:Craig McClanahan。Craig McClanahan是我比较崇拜的开发
人员之一。他开发了无数的OpenSource项目。包括大家都知道的Tomcat、Struts同时还是jsp,servlet
Spec制定成员之一,并是Java Server Face(jsf)的Team Leader.在此向Craig McClanahan致敬。
Digester把xml文件解析为Java Object有点象Castor。在本文中我使用一个简单的例子来介绍
Digester的使用,详细的文档看下面的连接:http://jakarta.apache.org/commons/digester.html
我做一个最简单的例子,因为Digester功能比较强大,需要更详细的例子参阅下面的文章
http://www.onjava.com/pub/a/onjava/2002/10/23/digester.html?page=1
http://www.javaworld.com/javaworld/jw-10-2002/jw-1025-opensourceprofile.html
使用Digester,需要jakarta下的如下包: BeanUtils, Collections, Logging.
Digester的下载地址:
http://apache.linuxforum.net/dist/jakarta/commons/digester/binaries/
目前版本为1.4

二:开始使用Digester.
现在有一个如下的xml文件
user.xml(e:/user.xml)
-------
<users>
<name>BASIC</name>
<pass>Example Basic Authentication Area</pass>
</users>

一个如下的java Object
com.henry.test.digester.BaseObject
-----------------------------------
public class BaseObject {
private String name = "";
private String pass = "";
/**
* Returns the name.
* @return String
*/
public String getName() {
return name;
}

/**
* Returns the pass.
* @return String
*/
public String getPass() {
return pass;
}

/**
* Sets the name.
* @param name The name to set
*/
public void setName(String name) {
this.name = name;
}

/**
* Sets the pass.
* @param pass The pass to set
*/
public void setPass(String pass) {
this.pass = pass;
}

public void setInfo(String name,String pass){
this.name = name;
this.pass = pass;

}

public void info() {
log("name:" + name + "...pass :" + pass);
}

private void log(String str) {
System.out.println(str);
}
}
现在我们要把user.xml里面的内容解析为一个BaseObject.
在以前我使用JDOM做解析。代码估计需要100行左右。
现在我使用Digester完成此项工作,你会发现非常的容易,而且很简单。

三:解析xml文件
Test.java
---------------
//import org.apache.commons.digester.Digester;
...............

public void parse() {
Digester digester = new Digester();
//创建Digester对象
BaseObject obj = new BaseObject();
try {
digester.addObjectCreate("users", "com.henry.test.digester.BaseObject");
//创建一个对象com.henry.test.digester.BaseObject
//对象对应的xml中为容users下的配置
digester.addCallMethod("users/name", "setName", 0);
//调用对象的方法setName并把users/name节点的值作为对象方法的参数
digester.addCallMethod("users/pass", "setPass", 0);
/*下面是调用setInfo(String,String)设置信息的使用
*digester.addObjectCreate("users", "com.henry.test.digester.BaseObject");
*digester.addCallMethod("users","setInfo",2);
*digester.addCallParam("users/name",0);
*digester.addCallParam("users/pass",1);
*/
//上面的两段代码功能一样都是使用反射实现对象的创建和方法的调用
//第二段是一个方法有多个参数的情况
obj=(BaseObject)(digester.parse("e:/user.xml"));
obj.info();
} catch (Exception ex) {
log(ex.getMessage());
}
}
............

上面的如此简单的代码就可以实现一个配置文件的解析。不错吧。

四:结束语
xml解析的方式有很多种,简单的运用jdom就可以解决问题.再不行使用Xerces等等。但对于一些
配置文件的解析使用Digester不失为一个很好的选择.简单,而且基本可以满足需要。够用为原则.
我没有去比较使用Digester,jdom的运行效率,因为实在是没有必要。但我使用过jdom去解析,虽然
很简单,但肯定比Digester复杂.

你可能感兴趣的:(apache,xml,struts,JSF,OpenSource)