使用Digester解析XML文档示例

原创 2003年06月22日 13:31:00

使用Digester解析XML文档示例

l_walker 2003-5-2

关键字:xml,digester,解析<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

内容摘要:

     本文简要介绍和示例了使用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" ?>

   

   

        Skyhome

        the web site system of www.skyinn.org

        2.0.1

        l_wakler

        walker@skyinn.org

        2003-04-30

   

 

   

   

       

            requestPath="/Home"

            actionClass="org.skyinn.action.GlobalAction">

       

 

       

            requestPath="/Forum"

            actionClass="org.skyinn.action.ForumAction">

       

   

 

 

 

 

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示例程序。

 *

 * @author walker(walker@skyinn.org)

 *

 * 参考文献:

 * Learning and Using Jakarta Digester

 * 用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

     *文件。

     * @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文件中的节点路径:...

         *addModuleInfo为本类中的一个方法(见下),即当碰到节点时

         *调用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方法即可,或者可以到我的网站上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

 

    

理解Tomcat(一) 利用Digester解析xml文件

Tomcat与Digester的关系我们利用Tomcat做服务器开发Web应用时,总会有一个配置文件web.xml,进行一些对象的实例化或是Servlet的映射的配置,所以要想理解Tomcat的一些配...
  • qq_24451605
  • qq_24451605
  • 2016年05月01日 09:34
  • 4663

利用Digester把XML转换为Java对象

在一个比较完整的应用系统里,经常需要有一些配置文件。简单的属性使用.properties文件即可,但要配置一些复杂对象,则应该考虑使用xml文件。一般用来读取xml文件的工具包有DOM、SAX和JDO...
  • kobejayandy
  • kobejayandy
  • 2013年10月09日 00:22
  • 1748

Java XML解析之Digester的使用

Java XML解析之Digester的使用   转自:http://mopishv0.blog.163.com/blog/static/5445593220102209508914/?sugg...
  • z69183787
  • z69183787
  • 2015年07月19日 12:44
  • 2108

使用Digester解析XML文档示例

  • 2012年07月25日 09:06
  • 6KB
  • 下载

使用Apache的Digester来解析XML文档

package com.wckj.entity; import java.io.ByteArrayInputStream; import java.io.IOException; import o...
  • wangjinwei6912
  • wangjinwei6912
  • 2014年07月09日 10:32
  • 549

Digester解析xml文档

依赖apache的四个包: commons-digester-2.1.jar commons-logging-1.1.1.jar commons-beanutils-1.8.3.jar com...
  • yufei2999
  • yufei2999
  • 2011年11月12日 12:01
  • 325

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

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了...
  • hai330
  • hai330
  • 2017年06月07日 11:02
  • 223

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

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xm...
  • changhenshui1990
  • changhenshui1990
  • 2017年04月11日 10:40
  • 114

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

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了...
  • u014709812
  • u014709812
  • 2015年05月19日 21:08
  • 225

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

原文链接 作者:Alexia(minmin) 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J下面首先给出这四种方法的jar包下载地址DOM:在...
  • u011116672
  • u011116672
  • 2015年12月29日 18:48
  • 652
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Digester解析XML文档示例
举报原因:
原因补充:

(最多只允许输入30个字)