使用Digester解析XML文档示例

    技术2022-05-11  137

    使用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,内容见下:

     

       

       

            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

     

        


    最新回复(0)