泰仔在线

java学习,心情日记,缤纷时刻
posts - 100, comments - 34, trackbacks - 0, articles - 0

使用Apache的Digester来解析XML文档

Posted on 2007-06-07 17:26 泰仔在线 阅读(4083) 评论(7)  编辑  收藏 所属分类: Java 相关

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/

Feedback

# re: 使用Apache的Digester来解析XML文档  回复  更多评论   

2007-06-30 14:46 by huwd
写得很好,非常喜欢.,支持并感谢.!!!!!

# re: 使用Apache的Digester来解析XML文档  回复  更多评论   

2007-11-15 15:24 by sgwood
按照你写得文章,我却产生了下面的异常:
java.net.MalformedURLException: no protocol: DigesterTest.xml
at java.net.URL.<init>(URL.java:567)
at java.net.URL.<init>(URL.java:464)
at java.net.URL.<init>(URL.java:413)
at org.apache.commons.digester.Digester.createInputSourceFromURL(Digester.java:1958)
at org.apache.commons.digester.Digester.parse(Digester.java:1804)
at DigesterTest.main(DigesterTest.java:62)

# re: 使用Apache的Digester来解析XML文档  回复  更多评论   

2007-11-15 15:33 by sgwood
我用的包有:commons-digester-1.8.jar
commons-beanutils-1.6jar
commons-collections-2.1.1.jar
log4j-1.2.211.jar
commons-logging-1.0.4.jar
commons-logging-api-1.1.jar
xerces-2.6.2.jar
请指教,谢谢

# re: 使用Apache的Digester来解析XML文档  回复  更多评论   

2007-11-16 13:43 by kxx129
应该不会啊,我这上面的代码都在jdk1.5下跑的通过了的啊
你这贴出来的信息太少,我也不知道问题在哪?
但有一点:
你的报错信息:java.net.MalformedURLException: no protocol: DigesterTest.xml

你的测试的xml文件也叫:DigesterTest.xml 吗?目录结构如何?
我测试时,这个是我的xml文件的名字,路径就在src的根目录下,你再看看!

# re: 使用Apache的Digester来解析XML文档  回复  更多评论   

2007-11-16 13:49 by kxx129
还有,你的xml文件是用什么编辑的啊?文件的编码是什么的啊?
我当时是在Eclipse下面编写的,文件编码是utf-8的,这个你也看一下!

# re: 使用Apache的Digester来解析XML文档  回复  更多评论   

2008-02-25 09:58 by sgwood
好久没来了.谢谢了,问题还是解决了

# re: 使用Apache的Digester来解析XML文档  回复  更多评论   

2008-03-03 19:27 by mei9771
在1.8版本中,那个parse方法的参数必须是URL或String的uri,因此,在windows下必须要在前面加上file:///

只有注册用户登录后才能发表评论。


网站导航: