liaowz

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            3 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks

          一:說明
          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.如果上面的文章有什么錯誤
          或者不足,也請給我指出,發送到上面的地址.

          ????
          ?

          posted on 2006-04-10 09:19 wenzhao 閱讀(360) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 麻城市| 库伦旗| 清远市| 司法| 高雄县| 吴忠市| 德昌县| 娱乐| 柯坪县| 胶南市| 嘉义市| 富阳市| 乐山市| 即墨市| 平度市| 红原县| 绵阳市| 临夏市| 威信县| 城固县| 象州县| 全州县| 潮州市| 长寿区| 文昌市| 灌南县| 台湾省| 张家口市| 临桂县| 荥阳市| 日照市| 株洲县| 周宁县| 阿克陶县| 名山县| 安康市| 阜阳市| 平果县| 会泽县| 连江县| 南宁市|