分享
 
 
 

使用Digester解析XML文档示例

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

使用Digester解析XML文档示例

l_walker 2003-5-2

关键字: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 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方法即可,或者可以到我的网站上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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有