`
苍然大漠
  • 浏览: 34384 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Digester的基于XML的规则集

阅读更多
用于Commons Digester的基于XML的规则集
Commons Digester 1.6提供了将XML转化为对象的最简单的方法。Digester已经由O'Reilly网站上的两篇文章介绍过了:“学习和使用Jakarta Digester”,作者是Philipp K. Janert,和“使用Jakarta Commons, 第二部分”,作者是Vikram Goyal。两篇文章都演示了XML规则集的使用,但如何在XML中定义规则集并没有理解。大多所见到的Digester的使用是程序化地定义规则集,以已编译的形式。你应该避免硬编码的Digester规则,特别是当你可以将映射信息存储在外部文件中或一个类路径资源中时。外部化一个Digester规则可以更好地适应一个演化中的XML文档结构或者说一个演化中的对象模型。

为了演示在XML中定义规则集与硬编码的规则集之间的区别,考虑系统解析XML给一个Person bean,包括在下面定义的属性—id, name和age。

package org.test;

public class Person {
  public String id;
  public String name;
  public int age;
               
  public Person() {}

  public String getId() { return id; }
  public void setId(String id) {
    this.id = id;
  }

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

  public int getAge() { return age; }
  public void setAge(int age) {
    this.age = age;
  }
}


确认你的应用需要解析一个包含了多个person元素的XML文件。下面的XML文件,data.xml,包含了两个person元素,你想要把它们解析到Person对象中:

<people>
  <person id="1">
    <name>Tom Higgins</name>
    <age>25</age>
  </person>
  <person id="2">
    <name>Barney Smith</name>
    <age>75</age>
  </person>
  <person id="3">
    <name>Susan Shields</name>
    <age>53</age>
  </person>
</people>


你希望如果结构和XML文件的内容在未来几个月中变化,你不需要在已编译的Java代码中硬编码XML文件的结构。为了做到这一点,你需要在一个XML文件中定义Digester的规则,并且它可以作为一种资源从类路径中装入。下面的XML文档,person-rules.xml,映射person元素到Person bean:
<digester-rules>
  <pattern value="people/person">
    <object-create-rule classname="org.test.Person"/>
    <set-next-rule methodname="add"
                      paramtype="java.lang.Object"/>
    <set-properties-rule/>
    <bean-property-setter-rule pattern="name"/>
    <bean-property-setter-rule pattern="age"/>
  </pattern>
</digester-rules>


上述所做的是指示Digester创建一个新的Person实例,当它遇到一个person元素时,调用add()来将Person对象加入到一个ArrayList中,设置person元素中相匹配的属性,并从下一级元素name和age中设置name和age的属性。

现在你已经看到了Person类,会被解析的文档,和以XML的形式定义的Digester规则。现在你需要创建一个由person-rules.xml定义了规则的Digester的实例。下面的代码创建 了一个Digester,通过将person-rules.xml的URL传递给DigesterLoader

既然person-rules.xml文件是与解析它的类在同一个包内的类路径资源,URL可以通过getClass().getResource()来得到。DigesterLoader然后解析规则并将它加到新创建的Digester上:

import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;

// 从XML规则集中配置Digester
URL rules = getClass().getResource("./person-rules.xml");
Digester digester =
    DigesterLoader.createDigester(rules);

// 将空的List推入到Digester的堆栈
List people = new ArrayList();
digester.push( people );

// 解析XML文档
InputStream input = new FileInputStream( "data.xml" );
digester.parse( input );


一旦Digester完成对data.xml的解析,三个Person对象将会在ArrayList people中。
与将规则定义在XML不同的方法是使用简便的方法将它们加入到一个Digester实例中。大多数文章和例子都用这种方法,使用addObjectCreate() 和 addBeanPropertySetter()这样的方法来将规则加入中Digester上。下面的代码加入了与定义在person-rules.xml中相同的规则:

digester.addObjectCreate("people/person",
                         Person.class);
digester.addSetNext("people/person",
                    "add",
                    "java.lang.Object");
digester.addBeanPropertySetter("people/person",
                               "name");
digester.addBeanPropertySetter("people/person",
                               "age");


如果你曾经发现自己正在用一个有着2500行代码的类,用SAX来解析一个巨大的XML文档,或者使用DOM或JDOM的完整的一个集合类,你就会理解XML的解析比它应该做的要复杂的多,就大多数情况来说。如果你正在建一个有着严格的速度和内存要求的高效的系统,你会需要SAX解析器的速度。如果你需要DOM级别3的复杂度,你会需要像Apache Xerces的解析器。但如果你只是简单的试图将几个XML文档解析到对象中去的话,看一下Commons Digester, 并把你的规则定义在一个XML文件中。

任何时候你都应该将配置信息从硬编码中移出来。我会建议你在一个XML文件中定义规则并从文件系统或类路径中装入它。这样可以使你的程序更好地适应XML文档以及对象模型的变化。有关在XML文件中定义Digester规则的更多的资料,参看Jakarta Commons Cookbook一书的6.2节,“将XML文档转换为对象”
分享到:
评论

相关推荐

    digester解析xml的问题.pdf

    需要注意的是,Digester 的规则通常是基于元素的深度优先遍历顺序,所以 XML 结构的顺序很重要。此外,虽然 Digester 提供了一种方便的方式来映射 XML 到 Java 对象,但它的灵活性和可维护性相比现代的 XML 解析技术...

    Digester读取XML学习

    Digester的使用基于一系列预定义或自定义的规则,这些规则决定了XML文档的元素与Java对象之间的映射关系。当解析XML时,它会按照这些规则触发相应的Java代码执行,简化了从XML到业务逻辑的转换过程。学习 Digester,...

    使用Digester解析XML文档示例

    Digester是Apache Jakarta项目下的一个工具类库,它简化了基于SAX(Simple API for XML)的XML解析过程。Digester能够根据定义好的规则自动将XML文档转换成Java对象,非常适合用在配置文件读取、数据交换等场景。 #...

    Digester解析XML文件

    这是一个Java库,它的主要功能是读取XML文件,并基于一系列预先定义的规则(Rule),自动创建和操作Java对象。这些规则可以指定在XML文档的特定位置执行的操作,例如创建新对象、设置属性值或调用方法。 在提供的...

    Digester java解析xml

    然后可以通过 `addRuleSet` 方法添加预定义的规则集,或者通过 `addRule` 添加自定义规则。 2. **规则(Rules)**: 规则是 Digester 的核心,它们定义了XML元素如何映射到Java对象。有多种类型的规则,如 `...

    利用commons-digester解析xml

    这是一个强大的Java库,它允许开发者通过简单的规则集来解析XML文档,这些规则可以将XML元素与Java对象的创建和操作关联起来。这些规则通常基于XPath表达式,使得我们可以非常灵活地匹配和处理XML结构。 在使用...

    java反射,Digester解析xml文档

    1. **定义XML规则**:在 Digester 对象上添加规则,将XML元素映射到Java对象的操作。 2. **设置监听器**:可以注册监听器来处理事件,比如对象创建、属性设置等。 3. **解析XML**:使用 Digester 的 `parse()` 方法...

    digester解析xml 所需jar包

    `Digester`通过`addRule`方法添加规则,这些规则基于XPath表达式,使得解析过程自动化且灵活。 要使用`Digester`,你需要在项目中引入以下jar包: 1. `commons-collections-3.2.1.jar`: 这是Apache Commons ...

    Apache xml转换java对象 Digester

    本文将详细介绍如何利用`Digester`结合基于XML的规则集来实现这一转换过程。 #### 二、Apache Commons Digester简介 `Apache Commons Digester`是一个功能强大且易于使用的Java库,专门用于将XML文档解析并转换为...

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

    Digester基于SAX事件模型,通过模式匹配机制识别XML元素,并根据预定义的规则(Rule)自动创建和填充Java对象。 #### 三、核心概念与特性 ##### 1. 内部机制 - **SAX解析**: Digester内部采用了SAX解析器来读取XML...

    xml解析commons-digester的demo

    下面我们将逐步讲解如何构建和运行一个基于Commons Digester的XML解析示例。 1. **引入依赖** 首先,你需要在项目中引入Apache Commons Digester的库。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```...

    Digester

    2. **模式匹配**:规则基于XPath表达式或者更简单的“路径”来匹配XML元素。例如,`/users/user`表示用户列表中的每个用户元素。通过这种方式,Digester可以定位到XML文档中的特定部分。 3. **类工厂与对象创建**:...

    digester jar 包

    Digester库的核心在于其规则集,这些规则定义了XML元素如何映射到Java对象的创建和属性设置。例如,一个简单的规则可能是“当遇到`&lt;employee&gt;`标签时,创建一个新的`Employee`对象”。 3. **配置和规则设定** ...

    Commons-digester:规则引擎全实例

    Apache Commons Digester 是一个强大的Java库,它允许开发人员根据预定义的规则集解析XML文档,并触发相应的Java对象创建、属性设置等操作。这个库广泛用于将XML配置文件转换为Java对象,简化了基于XML的配置过程。...

    digester使用

    - **错误处理**: Digester在处理XML时,如果没有正确地设置规则,可能会导致错误或异常,需要确保所有可能的路径都有对应的处理规则。 - **性能优化**:虽然Digester提供了方便的功能,但其性能相比DOM和SAX解析器...

    Castor、digester实例

    Apache Commons Digester是一个解析XML文档并基于规则执行相应操作的工具。与Castor不同,Digester并不提供对象到XML的映射,而是依赖于“消化规则”(digest rules)来解析XML并调用Java对象的方法。这些规则可以...

    commons-digester-2.1.jar

    通过调用`addRuleSet()`方法添加规则集,然后使用`parse()`方法解析XML。 在使用`commons-digester`时,需要注意XML文档的结构应与Java对象的结构相对应,以及正确配置规则以匹配XML元素和对象属性。同时,为了调试...

    使用Apache_Commons_Digester

    Apache Commons Digester 是一款基于 Java 的开源库,专门用于简化 XML 文件解析的过程。它利用 SAX(Simple API for XML)解析器来解析 XML 数据,并通过一系列预定义规则来创建 Java 对象模型。这种方式极大地简化...

Global site tag (gtag.js) - Google Analytics