使用Digester解析XML文档示例

xml|示例

一. 概述

  解析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(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方法即可。

时间: 2024-10-04 09:14:45

使用Digester解析XML文档示例的相关文章

Digester解析XML文档Sample

xml 解析XML文档 Digester的使用相当简单,请参看如下的SampleDigester类中的注释,这里不再拗述: /*============================================================ * Copyright:www.skyinn.org (c) 2002 - 2003 All rights reserved. * File:org.skyinn.quasar.config.SampleDigester * Inculde:Samp

四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

原文链接 作者:Alexia(minmin) 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SAX:http://sourceforge.net/projects/sax/ JDOM:http://jdom.org/downloads/index.html DOM4J:http://sourceforge.net/proj

java中四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)_java

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SAX:http://sourceforge.net/projects/sax/ JDOM:http://jdom.org/downloads/index.html DOM4J:http://sourceforge.net/projects/dom4j/  一.介绍及优缺点分析

《Python Cookbook(第3版)中文版》——6.7 用命名空间来解析XML文档

6.7 用命名空间来解析XML文档 6.7.1 问题 我们要解析一个XML文档,但是需要使用XML命名空间来完成. 6.7.2 解决方案 考虑使用了命名空间的如下XML文档: <?xml version="1.0" encoding="utf-8"?> <top> <author>David Beazley</author> <content> <html xmlns="http://www

解析xml文档的一个简单php类

xml //原创,可以自由使用,欢迎提出改进意见, <?PHP//xml中的元素class XMLTag{ var $parent;//父节点 var $child;//子节点 var $attribute;//本节点属性 var $data;//本节点数据 var $TagName;//本节点名称 var $depth;//本节点的深度,根节点为1 function XMLTag($tag='') {  $this->attribute = array();  $this->child

使用PHP 5.0 轻松解析XML文档(1)

xml 用sax方式的时候,要自己构建3个函数,而且要直接用这三的函数来返回数据, 要求较强的逻辑. 在处理不同结构的xml的时候, 还要重新进行构造这三个函数,麻烦! 用dom方式,倒是好些,但是他把每个节点都看作是一个node,操作起来要写好多的代码, 麻烦! 网上有好多的开源的xml解析的类库, 以前看过几个,但是心里总是觉得不踏实,感觉总是跟在别人的屁股后面. 这几天在搞java, 挺累的,所以决定换换脑袋,写点php代码,为了防止以后xml解析过程再令我犯难,就花了一天的时间写了下面一

VC++中利用MSXML解析XML文档

c++|xml 四.程序实现 下面通过一个具体的实例来说明在VC++中如何利用MSXML解析XML文档. (1)源XML文档(xmlfile.xml)如下: <?xml version="1.0" encoding="GB2312"?> <Device id="10041" name="设备1"> <Type>13</Type> <TypeName>保护</Ty

使用PHP 5.0 轻松解析XML文档(6)

xml 下面是通过createNode()函数,添加商品, 然后显示添加后的结果 <?xml version="1.0" encoding="GB2312" ?><shop> <name>华联</name> <address>北京长安街-9999号</address> <desc>连锁超市</desc> <telphone>123456789</telp

使用PHP 5.0 轻松解析XML文档(5)

xml 下面是通过getNode()函数,返回某一个分类下的所有商品的信息商品名: food11Array( [name] => food11 [price] => 12.90)Array( [id] => food11)商品名:food12Array( [name] => food12 [price] => 22.10 [desc] => Array ( [value] => 好东西推荐 [attrs] => Array ( [creator] =>