`

用Digester简化XML配置文件处理

    博客分类:
  • XML
阅读更多

Jakarta Commons Digester是目前流行的、开放源码的XML文件处理实用软件包。本文简要介绍了Digester的功能,并且以一个程序来示范如何利用该软件简化原本复杂的XML配置文件的解析过程。

Apache小组的Jakarta项目下有许多知名的基于java的开放源码子项 目,包括Tomcat,Ant,log4j,struts等等。相比之下,Jakarta Commons子项目在它们当中则属于知名度比较低的。该项目致力于提供可重用的java构件,例如:Commons BeanUtils, Commons DBCP 以及Commons Logging等。利用它们可以大大减少的一些乏味的重复编码工作。本文将重点介绍Commons Digester,它具有把XML文件映射到Java对象的能力。也许恰好她能解决你目前的问题呢!那么,请继续往下看吧。

需要注意的是:在启用Digester之前,你的classpath下必须已经安 装了这些软件包:Digester ,BeanUtils, Collections, Logging,还有一个遵循SAX(Simple API for XML)2.0或JAXP(Java API for XML Parsing) 1.1规范的XML解析器。 有关Jakarta Commons所有的构件,以及两个合适的解析器Crimson和Xerces的链接可以在本文的相关资源中找到。

XML解析简介

总的来说,XML文件解析有2种基本方法。一种是DOM(Document Object Model)方法。采用DOM方法进行解析时,XML解析器读取整个XML文件并生成一个树状表达方式。另一个是使用SAX,它的特点是不需要遍历整个文 件而是用事件驱动来解析文件。虽然DOM方法有时实现起来比较容易,但是与SAX方法相比速度更慢而且更耗资源。Digester构件通过为SAX事件提 供高级的接口大大简化了SAX方法的解析过程。该接口隐含了大量XML文件处理的复杂的技术细节。使开发人员得以集中精力处理XML数据而不是花太多的时 间在如何解析文件本身上。

Digester的几个重要概念

Digester引入了3个重要概念:元素匹配模式,处理规则以及对象栈。

元素匹配模式将处理规则与XML元素联系起来。以下是一个XML层次结构的元素匹配模式的例子。

<datasources>          'datasources'
  <datasource>         'datasources/datasource'
    <name/>            'datasources/datasource/name'
    <driver/>          'datasources/datasource/driver'  
  </datasource>
  <datasource>         'datasources/datasource'
    <name/>            'datasources/datasource/name'
    <driver/>          'datasources/datasource/driver'  
  </datasource>
</datasources>
 

 

每当发现一个匹配的模式,对应的处理规则就被激活。在上面的示例中,与'datasource/datasource'相关联的规则将会运行2次。

处理规则定义了发现匹配的模式时产生的行为。Digester模块已经预定了不少处理规则,自定义的处理规则可以通过扩展 org.apache.commons.digester.Rule类来实现。

对象栈用来保存处理规则所要处理的对象。对象可以由人为或处理规则压入和弹出对象栈。

使用Digester

Digester 时常用于解析XML配置文件,下面例子中的XML文件包含了用于创建DataSource池的配置信息。 其中DataSource是抽象类,拥有一个空的构造函数,多个get,set方法来存取字符串。

<?xml version="1.0"?>
<datasources>
  <datasource>
    <name>HsqlDataSource</name>
    <driver>org.hsqldb.jdbcDriver</driver>
    <url>jdbc:hsqldb:hsql://localhost</url>
    <username>sa</username>
    <password></password>
  </datasource>                                                     
  <datasource>
    <name>OracleDataSource</name>
    <driver>oracle.jdbc.driver.OracleDriver</driver>
    <url>jdbc:oracle:thin:@localhost:1521:orcl</url>
    <username>scott</username>
    <password>tiger</password>
  </datasource>
</datasources>
 

 

. 要使用Digester对之进行解析,首先我们要创建一个Digester类的实例,然后把所需的对象都压入到Digester对象栈中,设置一系列处理规则,最后,对文件进行解析。下面是一个例子:

Digester digester = new Digester();
digester.addObjectCreate("datasources/datasource", "DataSource");
digester.addCallMethod("datasources/datasource/name","setName",0);
digester.addCallMethod("datasources/datasource/driver","setDriver", 0);
digester.parse("datasource.xml");
 

 

在这个例子中,你可以看到,addObjectCreate()方法把一个 ObjectCreateRule添加到'datasources/datasource'模式中。这样,ObjectCreateRule将创建一个新 的DataSource类的实例并把它压入Digester的对象栈中。随后,addCallMethod()方法把CallMethodRule分别添 加到两个模式中。结果是,CallMethodRule将调用位于对象栈顶部的对象的特定的方法,addCallMethod()的最后一个参数指定了传 入该方法的参数数目,如果数目为0则匹配上的数据项内容将作为参数传入。(注:类ObjectCreateRule,CallMethodRule 都是Digester模块已定义的处理规则)

假如应用这个代码断来处理在前面提到的XML文件,将会发生以下结果:

· 一个新的DataSource类的实例将被创建并压入堆栈;

· 调用该实例的setName(String name)方法,参数值为'HsqlDataSource';

· 调用该实例的setDriver(String driver)方法,参数值为'OracleDataSource'。

在对'datasource'元素的处理结束后,对象从堆栈中弹出,文件剩余部分的 解析重复以上过程。上面的例子存在一个问题,在对相关元素的处理结束后,ObjectCreateRule会弹出它创建的对象。因此,当Digester 完成解析文件后,只有最后一次创建的对象被保留下来。解决这个问题也很容易,只要把对象在解析开始之前压入堆栈,随后调用该对象的某个方法来创建所需的任 意对象。下面的类就是这个办法的一个演示:

public class SampleDigester
{
  public void run() throws IOException, SAXException
  {    
    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);

    // This set of rules calls the addDataSource method and passes
    // in five parameters to the method.
    digester.addCallMethod ("datasources/datasource", "addDataSource", 5);
    digester.addCallParam("datasources/datasource/name", 0);
    digester.addCallParam("datasources/datasource/driver", 1);
    digester.addCallParam("datasources/datasource/url", 2);
    digester.addCallParam("datasources/datasource/username", 3);
    digester.addCallParam("datasources/datasource/password", 4);
    // This method starts the parsing of the document.
    digester.parse("datasource.xml");
  }
  // Example method called by Digester.
  public void addDataSource(String name,
                            String driver,
                            String url,
                            String userName,
                            String password)
  {
    // create DataSource and add to collection...
  }
}
 

 

在上面的SampleDigester类中,每当匹配到 'datasources/datasource'时都会自动调用addDataSource()方法。addCallParam()方法将匹配到的数据 项内容作为传入addDataSource()方法的参数。在addDataSource()方法中,你就可以创建具体的DataSouce并把它添加入 你的DataSource集合中去。

深入了解Digester

尽管Digester最初是为了简化对XML配置文件的解析而开发的。但是它也可以用在把 XML文件映射到java对象的场合。本文只是对Digester的简要介绍。如果要深入了解Digester或Jakarta Commons 项目中的其他公共组件,可以访问Jakarta Commons的官方网站。另外,可以参考以下的相关资源,从这些开放源代码的项目应用中学习Digester的用法。

相关资源

·The Jakarta Commons homepage: http://jakarta.apache.org/commons

·Two open source XML parsers suitable for use with Digester are:

o Xerces

o Crimson

·Open source projects that use Digester:

o Struts

o Tomcat

·Other Jakarta Commons components:

http://jakarta.apache.org/commons/components.html

· Erik Swenson's previous Open Source Profile column, "Reports Made Easy with JasperReports" (JavaWorld, September 2002):

http://www.javaworld.com/javaworld/jw-09-2002/jw-0920-opensourceprofile.html

· Browse the Java and XML section of JavaWorld's Topical Index:

http://www.javaworld.com/channel_content/jw-xml-index.shtml

·Chat about Java development in the JavaWorld Forum:

http://forums.devworld.com/webx?13@@.ee6b802

· Sign up for JavaWorld's free weekly email newsletters:

http://www.javaworld.com/subscribe

· You'll find a wealth of IT-related articles from our sister publications at IDG.net

分享到:
评论

相关推荐

    digester组件简化了xml文件处理操作

    ### Digester组件简化XML文件处理操作 #### 一、引言 随着Web技术的发展,XML作为数据交换格式的重要性日益凸显。然而,对于大型且复杂的XML文档进行解析与处理时,传统的方法如DOM(Document Object Model)和SAX...

    利用commons-digester解析xml

    在提供的文件列表中,有一个名为“Privilege”的文件,这可能是示例中的一个权限或者角色相关的类,或者是一个XML配置文件,用于演示如何使用Digester解析与权限或角色相关的XML数据。具体用途可能需要参考实际的...

    Digester的XML规则文件配置

    值得注意的是,为了确保配置文件能够被正确地解析,XML文档配置文件必须使用DTD(Document Type Definition,文档类型定义),而DTD正是`xmlrules`包的一部分。 #### Digester与XML规则文件 在实际应用中,我们...

    Digester解析XML文件

    总结起来,Apache Commons Digester提供了一种高效且灵活的方法来解析XML文件,将其内容映射到Java对象上,极大地简化了处理XML的工作。通过理解XML文档的结构,定义合适的规则,我们可以构建出强大的XML数据处理...

    使用Digester解析XML文档示例

    在实际开发中,尤其是处理复杂的XML配置文件时,使用Digester可以提高效率并减少错误。此外,Digester还支持多种配置方式,可以根据具体需求灵活选择。 通过本篇示例的学习,读者可以了解到Digester的基本使用方法...

    Digester解析XML

    **Digester** 是Apache Commons项目中的一个子项目,主要用于简化XML文档的解析工作。它建立在SAX的基础之上,通过定义一系列的模式(Pattern)和规则(Rule),能够有效地处理复杂的XML结构,从而简化开发者的编程...

    Digester读取XML学习

    同时,理解Struts、Hibernate和Spring的配合工作,也能增强对XML配置和对象绑定的理解。 Digester的学习是一个从理论到实践的过程,通过不断的实践和理解,可以更有效地将XML数据转化为可操作的Java对象,从而提高...

    digester解析xml必备包.rar

    使用这些库,开发者可以创建一个XML配置文件,定义XML结构与Java对象之间的映射规则。例如,XML文件中的每个`&lt;employee&gt;`元素可能对应一个`Employee`类的实例,而`&lt;employee&gt;`的`&lt;name&gt;`和`&lt;age&gt;`子元素则分别映射到...

    使用digester配置rule.xml规则来解析自定义的xml文件-代码

    本篇文章将深入探讨如何使用Digester和`rule.xml`配置文件来解析自定义的XML文件。 首先,让我们了解什么是Apache Digester。Digester是一个开源库,它提供了从XML到Java对象的映射功能。通过定义一系列的“消化...

    使用Apache的Digester来解析XML文档

    这个工具尤其适用于那些需要频繁从XML配置文件中读取数据的项目。 一、Apache Digester简介 Apache Digester的核心功能是通过定义一系列规则(Rule),将XML文档中的元素与Java对象的方法或属性关联起来。这些规则...

    利用Digester把XML转换成为Java对象

    使用Digester来处理XML配置文件是一种高效且灵活的方式,它能够显著减少代码量并提高系统的可维护性和扩展性。通过将XML文件与Java Bean之间的映射关系配置好,我们可以轻松地将XML文件中的配置数据转换成Java对象,...

    org.apache.commons.digester解析XML.rar

    - **配置文件解析**:Digester常用于处理XML配置文件,创建和初始化Java对象。 - **XML数据绑定**:在处理XML格式的数据交换时,可以方便地将XML转换为Java对象模型。 - **简化对象构建**:在对象层级复杂,需要...

    Digester解析XML问题.pdf

    Apache Commons Digester是一个用于将XML数据映射到Java对象的工具,主要应用于处理XML配置文件或数据文件。它通过定义一系列的模式和规则,能够自动地创建和填充Java对象的结构,大大简化了XML解析的过程。 ...

    Digester java解析xml

    在Java开发中,处理XML数据时,Digester是一个强大的工具,尤其在构建配置文件或者进行数据输入时。 Digester的基本工作原理是通过规则(Rules)来定义XML元素和Java对象之间的关系。当XML解析器遇到匹配的元素时,...

    XML的解析之——使用Digester

    本文将深入探讨如何使用Apache的 Digester 库来解析XML文档,这是一款强大的工具,能够将XML数据映射到Java对象,简化了处理XML的过程。 Digester 是Apache Commons项目的一部分,它提供了一种规则驱动的方法来处理...

    java反射,Digester解析xml文档

    3. **解析XML**:使用 Digester 的 `parse()` 方法读取XML文件,根据预先定义的规则进行处理。 4. **结果处理**:最后,Digester会生成一个对象模型,代表了XML文档的内容。 以下是一个简单的 Digester 使用示例: ...

    digester解析xml 所需jar包

    在Java开发中,XML(可扩展标记语言)作为一种数据交换格式,被广泛应用于配置文件、数据传输等场景。为了方便地解析和操作XML文档,Apache组织提供了一个名为`Digester`的工具,它是一个用于将XML文档映射到Java...

    digester解析xml

    假设我们有如下XML配置文件: ```xml ``` 我们可以使用Digester创建对应的Java对象: ```java Digester digester = new Digester(); digester.addObjectCreate("config", "com.example.Config"); digester....

Global site tag (gtag.js) - Google Analytics