解析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([email protected]) 
 * <p> 
 * <strong>参考文献:</strong><p> 
 * <a href="http://www.onjava.com/pub/a/onjava/2002/10/23/digester.html" target="_blank">Learning and Using Jakarta Digester</a><p> 
 * <a href="http://developer.ccidnet.com/pub/disp/Article?columnID=340&articleID=33259&pageNO=1" 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
   
 
  |