風行天下

          JAVA太極
          posts - 4, comments - 10, trackbacks - 0, articles - 55
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          使用Digester解析XML文檔示例

          Posted on 2005-07-25 11:51 風太少 閱讀(152) 評論(0)  編輯  收藏

          關鍵字:xml,digester,解析

          內容摘要:

               本文簡要介紹和示例了使用Apache的Digester來解析XML文檔的方法。

           

          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文件的路徑。

           

                  在您工程的類目錄(如classes)新建一commons-logging.properties文件,內容為:

                  org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4Jlogger

            這表明系統將使用log4j做為日志輸出,再建一log4j.proerties文件,內容請參看log4j文檔或其他參考資料。

           

          2.  XML文件

          在工程目錄下新建一個XML文件,示例使用module.xml,內容見下:

           

          <?xml version="1.0" encoding="gb2312" ?>

          <quasar_module>

              <!--模塊信息-->

              <module_info>

                  <name>Skyhome</name>

                  <description>the web site system of www.skyinn.org</description>

                  <version>2.0.1</version>

                  <author>l_wakler</author>

                  <mail>walker@skyinn.org</mail>

                  <update_time>2003-04-30</update_time>

              </module_info>

           

              <!--Action映射信息-->

              <action_mappings>

                  <action name="home"

                      requestPath="/Home"

                      actionClass="org.skyinn.action.GlobalAction">

                  </action>

           

                  <action name="forum"

                      requestPath="/Forum"

                      actionClass="org.skyinn.action.ForumAction">

                  </action>

              </action_mappings>

           

          </quasar_module>

           

           

           

          3.  解析XML文檔

          Digester的使用相當簡單,請參看如下的SampleDigester類中的注釋,這里不再拗述:

           

          /*============================================================

           * Copyright:www.skyinn.org (c) 2002 - 2003 All rights reserved.

           * File:org.skyinn.quasar.config.SampleDigester

           * Inculde:SampleDigester

           * Modify Records

           * Date              Author         Content

           * =============================================================

           * 2003-5-1          walker        create class

           * ============================================================*/

          package org.skyinn.quasar.config;

           

          import org.apache.commons.digester.Digester;

          import org.xml.sax.SAXException;

          import org.skyinn.quasar.action.ActionMapping;

           

          import java.io.IOException;

           

          /**

           * Digester解析XML示例程序。

           * <p>

           * @author walker(walker@skyinn.org)

           * <p>

           * <strong>參考文獻:</strong><p>

           * <a target="_blank">Learning and Using Jakarta Digester</a><p>

           * <a target="_blank">用Digester簡化XML配置文件處理</a>

           */

          public class SampleDigester{

           

              private String configFile;

           

              public void setConfigFile(final String configFile){

                  this.configFile = configFile;

              }

           

              /**

               * 開始解析。

               * <p>

               * 在本方法,new一個Digester的實例,并將本類(SampleDigester)的實例壓入

               *Digester的處理堆棧,調用Digester的addCallMethod方法將XML文件中的特定

               *節點與處理方法聯系起來,并吊桶addCallParam方法設置參數,隨后解析給定的XML

               *文件。

               * @throws IOException IO異常

               * @throws SAXException SAX異常

               */

              public void run() throws IOException, SAXException{

                  //新建Digester實例

                  Digester digester = new Digester();

                  // This  method pushes this (SampleDigester) class to the Digesters

                  // object stack making its method s available to processing rules.

                  digester.push(this);

                  /*quasar_module/module_info為XML文件中的節點路徑:<quasar_module><module_info>...

                   *addModuleInfo為本類中的一個方法(見下),即當碰到<quasar_module><module_info>節點時

                   *調用addModuleInfo方法,6表示該方法用六個參數,

                   */

                  digester.addCallMethod("quasar_module/module_info", "addModuleInfo", 6);

                  //逐個設置參數,第一個參數的索引為0

                  digester.addCallParam("quasar_module/module_info/name", 0);

                  digester.addCallParam("quasar_module/module_info/description", 1);

                  digester.addCallParam("quasar_module/module_info/version", 2);

                  digester.addCallParam("quasar_module/module_info/author", 3);

                  digester.addCallParam("quasar_module/module_info/mail", 4);

                  digester.addCallParam("quasar_module/module_info/update_time", 5);

                  // This method starts the parsing of the document.

                  digester.parse(this.configFile);

              }//end run()

           

              /**

               * 添加模塊信息。

               * <p>

               * 本方法僅將XML文件中的內容簡單輸出,實際應用中可以將獲得的信息進行進一步的處理。

               *

               * @param name 名字

               * @param description 描述

               * @param version 版本

               * @param author 作者

               * @param mail EMAIL

               * @param updateTime 更新時間

               */

              public void addModuleInfo(final String name,

                                        final String description,

                                        final String version,

                                        final String author,

                                        final String mail,

                                        final String updateTime){

                  //output

                  System.out.println("name=" + name + ",description=" + description

                                      + ",version=" + version + ",author=" + author

                                      + ",mail=" + mail + ",updateTime=" +updateTime);

              }//end addModuleInfo()

           

              /**

               * 添加Action映射。

               * <p>

               * 本方法僅簡單輸出了傳入的ActionMapping的信息,在具體應用中可將其加入系統Action映射集合中。

               * @param actionMapping Action映射

               */

              public void addActionMapping(final ActionMapping actionMapping){

                  System.out.println(actionMapping);

              }

           

              public static void main(String[] args){

                  SampleDigester sd = new SampleDigester();

                  sd.setConfigFile("module.xml");

                  try{

                      sd.run();

                      sd = null;

                  }catch(Exception e){

                      e.printStackTrace();

                  }

           

                  //__________________________________________

                  //演示另一種解析方法

                  Digester digester = new Digester();

                  digester.setValidating( false );

                  //生成本類實例

                  digester.addObjectCreate( "quasar_module/action_mappings", SampleDigester.class);

                  //生成ActionMapping實例

                  digester.addObjectCreate("quasar_module/action_mappings/action",ActionMapping.class);

                  //獲取屬性值,并將其存入ActionMapping實例

                  digester.addSetProperties("quasar_module/action_mappings/action","name","name");

                  digester.addSetProperties("quasar_module/action_mappings/action","requestPath","requestPath");

                  digester.addSetProperties("quasar_module/action_mappings/action","actionClass","actionClass");

                  //調用SampleDigester的addActionMapping方法

                  digester.addSetNext("quasar_module/action_mappings/action","addActionMapping");

                  try{

                      digester.parse("module.xml");

                  }catch(Exception e){

                      e.printStackTrace();

                  }

              }//end  main()

           

          }//EOC SampleDigester

           

           

          ActionMapping代碼清單由于過長這里就不給出了,請自行撰寫,只要使其有三個屬性:name,actionClass,requestPath以及他們的getter、setter方法和toString方法即可,或者可以到我的網站上Quasar的代碼在線瀏覽中找到該文件:

          http://www.skyinn.org

           

          本文簡要介紹了使用Apache digester解析XML文件的方法,使用其和XML結合來做配置系統非常方便,具體應用實例請參見Quasar的config包中相關部分:

          http://quasar.skyinn.org

           

           

          3.     參考文獻

          Learning and Using Jakarta Digester:

          http://www.onjava.com/pub/a/onjava/2002/10/23/digester.html

           

          Digester簡化XML配置文件處理:

          http://developer.ccidnet.com/pub/disp/Article?columnID=340&articleID=33259&pageNO=1

           

          4.     附錄

          Digester,BeanUtils,Collections,Commens-logging下載地址:

          http://jakarta.apache.org/site/binindex.cgi

             

                     Log4J下載地址:

                  http://jakarta.apache.org/log4j/docs/index.html

           

                  Xerces下載地址:

                  http://xml.apache.org/xerces2-j/index.html


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


          網站導航:
           
          主站蜘蛛池模板: 东乡族自治县| 甘洛县| 即墨市| 绍兴市| 丹凤县| 霍邱县| 宝鸡市| 农安县| 黑水县| 镇巴县| 措美县| 康乐县| 麦盖提县| 巴林右旗| 玉田县| 泾源县| 合山市| 从江县| 泰安市| 昌乐县| 右玉县| 朔州市| 营山县| 垦利县| 安康市| 剑阁县| 铁力市| 赣榆县| 雅江县| 大宁县| 正宁县| 荥阳市| 翁牛特旗| 公安县| 南投县| 泗阳县| 彭泽县| 云安县| 潼南县| 永宁县| 盐津县|