使用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文件的路径。

2.  XML文件

在工程目录下新建一个 XML文件,示例使用DigesterTest.xml,内容见下:
<? xml version="1.0" encoding="UTF-8"  ?>
< root >
    
<!--  这里是注释  -->
    
< events >
        
< event >
            
< date >
                
<![CDATA[ 2007年5月10日 ]]>
            
</ date >
            
< address >
                
<![CDATA[ 江东影城 ]]>
            
</ address >
            
< person >
                
<![CDATA[ person1|person2|person3 ]]>
            
</ person >
            
< title >
                
<![CDATA[ 《阪神×巨人戦》 ]]>
            
</ title >
        
</ event >
        
< event >
            
< date >
                
<![CDATA[ 2007年5月11日 ]]>
            
</ date >
            
< address >
                
<![CDATA[ 江南水庄 ]]>
            
</ address >
            
< person >
                
<![CDATA[ person1|person2|person3 ]]>
            
</ person >
            
< title >
                
<![CDATA[ 吃鱼苗 ]]>
            
</ title >
        
</ event >
    
</ events >
    
    
< configs >
        
< config  key ="root.configs.config1"  value ="value1" />
        
< config  key ="root.configs.config2"  value ="value2" />
        
< config  key ="root.configs.config3"  value ="value3" />
    
</ configs >
</ root >

3.  解析XML文档
   Digester使用相当简单,请参看如下的DigesterTest类中的注释
package  test;

import  java.io.IOException;

import  org.apache.commons.digester.Digester;
import  org.xml.sax.SAXException;

/** */ /**
 * DigesterTest<br>
 * 用Digester简化XML配置文件处理<br>
 * 2007-6-7 ver1.00 Yusx<br>
 * 
 * 
@author Yusx
 * 
@version 1.00
 
*/

public   class  DigesterTest  {

    
private String configFile;
    
    
/** *//**
     * 设置XML文件路径
     * 
@param configFile 路径
     
*/

    
public void setConfigFile(String configFile) {
        
this.configFile = configFile;
    }

    
    
/** *//**
     * 解析XML文件
     * 
@throws IOException
     * 
@throws SAXException
     
*/

    
public void run() throws IOException, SAXException {
        
        
// 新建Digester实例
        Digester digester = new Digester();
        
// 将本实例放入Digester处理堆栈
        digester.push(this);
        
        
/**//*
         * root/events/event: XML文件中的节点路径
         * addEventInfo: 遇到到该节点时执行的方法
         *         addEventInfo 本类的一个方法
         *         4 调用 addEventInfo 方法需要传入4个参数
         
*/

        digester.addCallMethod(
"root/events/event""addEventInfo"4);
        
        
/**//*
         * 逐个设置 addEventInfo 方法的参数,下标从0开始
         * 参数的值为对应节点 (root/events/event/date) 的值
         
*/

        digester.addCallParam(
"root/events/event/date"0);
        digester.addCallParam(
"root/events/event/address"1);
        digester.addCallParam(
"root/events/event/person"2);
        digester.addCallParam(
"root/events/event/title"3);
        
        
// 开始解析XML文件
        digester.parse(this.configFile);
        
    }
// end run()
    
    
/** *//**
     * 对XML参数进行处理
     *         本方法仅将XML文件中的内容简单输出,实际应用中可以将获得的信息进行进一步的处理。
     * 
@param date 时间
     * 
@param address 地点
     * 
@param person 人物
     * 
@param title 事件title
     
*/

    
public void addEventInfo(String date, String address, String person, String title) {
        
        System.out.println(
"person=" + person + ",date=" + date
                
+ ",address=" + address + ",title=" + title);

    }
// end addEventInfo()
    
    
/** *//**
     * 对XML参数进行处理
     *         本方法仅将XML文件中的内容简单输出,实际应用中可以将获得的信息进行进一步的处理。
     * 
@param attr Attribute 对象
     
*/

    
public void addAttributeInfo(Attribute attr) {
        
// 调用 Attribute 对象的 toString() 方法 
        System.out.println(attr);
    }
// end addAttributeInfo()

    
/** *//**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        DigesterTest dt 
= new DigesterTest();
        
// 设置XML文件路径
        dt.setConfigFile("DigesterTest.xml");        
        
try {
            dt.run();
            dt 
= null;
        }
 catch (IOException e) {
            e.printStackTrace();
        }
 catch (SAXException e) {
            e.printStackTrace();
        }

        
        
//-----------------------------------------------------------------
        
// 演示另一种解析方法
        Digester digester = new Digester();
        
// 生成本类的实例
        digester.addObjectCreate("root/configs/config", DigesterTest.class);
        
        
// 生成 Attribute 对象实例,对XML文件中root/configs/config节点的属性进行封装
        digester.addObjectCreate("root/configs/config", Attribute.class);
        
/**//*
         * 获取节点的属性值,并将其存入Attribute实例
         *         key 对应节点的属性名
         *         name 对应Attribute实例的属性名
         
*/

        digester.addSetProperties(
"root/configs/config""key""name");
        digester.addSetProperties(
"root/configs/config""value""value");
        
// 定义解析到对应节点(root/configs/config)时,调用本实例的 addAttributeInfo 方法
        digester.addSetNext("root/configs/config""addAttributeInfo");
        
try {
            
// 开始解析XML文件
            digester.parse("DigesterTest.xml");
        }
 catch (IOException e) {
            e.printStackTrace();
        }
 catch (SAXException e) {
            e.printStackTrace();
        }

    }
// end main()

}


附Attribute.java的代码
package  test;

public   class  Attribute  {
    
    
private String name = null;
    
    
private String value = null;

    
public String getName() {
        
return name;
    }


    
public void setName(String name) {
        
this.name = name;
    }


    
public String getValue() {
        
return value;
    }


    
public void setValue(String value) {
        
this.value = value;
    }

    
    
public String toString() {
        
return "name=" + this.name + " value=" + this.value;
    }

}

Digester,BeanUtils,Collections,Commens-logging下载地址:
      http://jakarta.apache.org/commons/digester/

你可能感兴趣的:(使用Apache的Digester来解析XML文档)