關鍵字: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的代碼在線瀏覽中找到該文件:
本文簡要介紹了使用Apache digester解析XML文件的方法,使用其和XML結合來做配置系統非常方便,具體應用實例請參見Quasar的config包中相關部分:
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下載地址: