一:說明
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復雜.
如果你對Digester有更深的理解,記得聯系我:henry_ge@mail.com.如果上面的文章有什么錯誤
或者不足,也請給我指出,發送到上面的地址.
????
?