一. 概述
解析xml文档方面有不少的方法,也有不少的工具包可用,这里介绍的是来自apache jakarta的digester,使用其解析xml文件非常方便而不需要过多的关心底层的具体解析过程。
digester最早出现在struts中,后来随着struts的发展以及其的公用性而被提到commens中独自立项,其底层实现的是sax解析。当前版本为:1.5
二. 正文
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( alker@skyinn.org )
* <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
actionmapping代码清单由于过长这里就不给出了,请自行撰写,只要使其有三个属性: name,actionclass,requestpath以及他们的getter、setter方法和tostring方法即可。
闽公网安备 35060202000074号