使用commons-digester解析XML文档示例

一.概述
解析XML文档方面有不少的方法,也有不少的工具包可用,这里介绍的是来自Apache Jakarta的Digester,使用其解析XML文件非常方便而不需要过多的关心底层的具体解析过程。
Digester最早出现在Struts中,后来随着Struts的发展以及其的公用性而被提到commens中独自立项,其底层实现的是SAX解析。 
二.正文
1.安装与配置
使用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文档
package  digester;

import  org.apache.commons.digester.Digester;
import  org.xml.sax.SAXException;
import  java.io.IOException;

/**
 * Digester解析XML示例程序。
 
*/

public   class  SampleDigester  {

    
private String configFile;

    
public void setConfigFile(final String configFile) {
        
this.configFile = configFile;
    }


    
/**
     * 开始解析。 在本方法,new一个Digester的实例,并将本类(SampleDigester)的实例压入
     * Digester的处理堆栈,调用Digester的addCallMethod方法将XML文件中的特定
     * 节点与处理方法联系起来,并吊桶addCallParam方法设置参数,随后解析给定的XML 文件。
     
*/

    
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()

    
/**
     * 添加模块信息。 本方法仅将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映射。 本方法仅简单输出了传入的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方法即可。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值