Turning an XML document into a corresponding hierarchy of Java bean objects is a fairly common task. In a previous article, I described how to accomplish this using the standard SAX and DOM APIs.
Although powerful and flexible, both APIs are, in effect, too low-level for the specific task at hand. Furthermore, the unmarshalling procedure itself requires a fair amount of coding: a parse-stack must be maintained when using SAX, and the DOM-tree must be navigated when using DOM.
This is where the Apache Jakarta Commons Digester framework comes in.
The Jakarta Digester Framework
The Jakarta Digester framework grew out of the Jakarta Struts Web toolkit. Originally developed to process the central struts-config.xml configuration file, it was soon recognized that the framework was more generally useful, and moved to the Jakarta Commons project, the stated goal of which is to provide a "repository of reusable Java components." The most recent version, Digester 1.3, was released on August 13, 2002.
The Digester class lets the application programmer specify a set of actions to be performed whenever the parser encounters certain simple patterns in the XML document. The Digester framework comes with 10 prepackaged "rules," which cover most of the required tasks when unmarshalling XML (such as creating a bean or setting a bean property), but each user is free to define and implement his or her own rules, as necessary.
The Example Document and Beans
In this example, we will unmarshall the same XML document that we used in the previous article:
<?xml version="1.0"?>
<catalog library="somewhere">
<book>
<author>Author 1</author>
<title>Title 1</title>
</book>
<book>
<author>Author 2</author>
<title>His One Book</title>
</book>
<magazine>
<name>Mag Title 1</name>
<article page="5">
<headline>Some Headline</headline>
</article>
<article page="9">
<headline>Another Headline</headline>
</article>
</magazine>
<book>
<author>Author 2</author>
<title>His Other Book</title>
</book>
<magazine>
<name>Mag Title 2</name>
<article page="17">
<headline>Second Headline</headline>
</article>
</magazine>
</catalog>
The bean classes are also the same, except for one important change: In the previous article, I had declared these classes to have package scope -- primarily so that I could define all of them in the same source file! Using the Digester framework, this is no longer possible; the classes need to be declared as public (as is required for classes conforming to the JavaBeans specification):
import java.util.Vector;
public class Catalog {
private Vector books;
private Vector magazines;
public Catalog() {
books = new Vector();
magazines = new Vector();
}
public void addBook( Book rhs ) {
books.addElement( rhs );
}
public void addMagazine( Magazine rhs ) {
magazines.addElement( rhs );
}
public String toString() {
String newline = System.getProperty( "line.separator" );
StringBuffer buf = new StringBuffer();
buf.append( "--- Books ---" ).append( newline );
for( int i=0; i<books.size(); i++ ){
buf.append( books.elementAt(i) ).append( newline );
}
buf.append( "--- Magazines ---" ).append( newline );
for( int i=0; i<magazines.size(); i++ ){
buf.append( magazines.elementAt(i) ).append( newline );
}
return buf.toString();
}
}
public class Book {
private String author;
private String title;
public Book() {}
public void setAuthor( String rhs ) { author = rhs; }
public void setTitle( String rhs ) { title = rhs; }
public String toString() {
return "Book: Author='" + author + "' Title='" + title + "'";
}
}
import java.util.Vector;
public class Magazine {
private String name;
private Vector articles;
public Magazine() {
articles = new Vector();
}
public void setName( String rhs ) { name = rhs; }
public void addArticle( Article a ) {
articles.addElement( a );
}
public String toString() {
StringBuffer buf = new StringBuffer( "Magazine: Name='" + name + "' ");
for( int i=0; i<articles.size(); i++ ){
buf.append( articles.elementAt(i).toString() );
}
return buf.toString();
}
}
public class Article {
private String headline;
private String page;
public Article() {}
public void setHeadline( String rhs ) { headline = rhs; }
public void setPage( String rhs ) { page = rhs; }
public String toString() {
return "Article: Headline='" + headline + "' on page='" + page + "' ";
}
}
分享到:
相关推荐
1. **创建 Digester 实例**:首先创建一个 `org.apache.commons.digester.Digester` 实例,并为其配置实现 `DigesterRule` 接口的对象。 2. **初始化 Stack**:使用 `Digester.push()` 方法将一个初始对象放入 ...
In [1]: from django_tastypie_digester import Api In [2]: api = Api('http://127.0.0.1:8000/api/v1/') In [3]: api Out[3]: 使用基本的 http 身份验证(目前仅支持此身份验证) In [2]: api = Api('...
1. 创建一个`Digester`实例。实例化后,它可以安全地重复使用,但需要注意的是,它是非线程安全的。 2. 配置`Digester`属性,例如设置是否验证XML文档。 3. 添加处理规则,这些规则定义了当解析到特定的XML节点时应...
1. **XML到Java对象映射**:Digester允许开发者定义一系列的规则,这些规则将XML元素映射到Java对象的实例化、方法调用或属性设置。例如,一个`<user>`元素可能对应一个`User`类的实例,而`<user>`内的`<name>`元素...
1. **初始化**: 创建`Digester`实例,并设置必要的配置,如命名空间处理、错误处理等。 2. **规则设置**: 定义一系列规则,每个规则通常包括一个模式(对应XML文档的路径)和一个动作(当模式匹配时执行的操作,如...
1. **设置消化规则**:定义XML元素与Java方法之间的映射规则,当解析到特定XML元素时, Digester会调用相应的Java方法。 2. **解析XML**:使用`Digester`解析XML文档,并根据设定的规则执行操作。 下面是一个基本的...
1. **初始化 Digester**: 在使用 Digester 之前,我们需要创建一个 Digester 实例,并设置一些基本配置,例如XML解析器的命名空间处理等。然后可以通过 `addRuleSet` 方法添加预定义的规则集,或者通过 `addRule` ...
赠送jar包:commons-digester3-3.2.jar; 赠送原API文档:commons-digester3-3.2-javadoc.jar; 赠送源代码:commons-digester3-3.2-sources.jar; 赠送Maven依赖信息文件:commons-digester3-3.2.pom; 包含翻译后...
1. **Rule**: Rule是Digester的核心元素,它定义了一个处理XML元素的行动。当 Digester解析到匹配的XML元素时,就会执行对应的Rule。例如,你可以定义一个Rule来创建一个新的Java对象,或者将XML属性值设置到已存在...
1. **依赖冲突**:Maven项目中可能已经包含了其他版本的`commons-digester`或者与其有依赖关系的库,导致版本不兼容。 2. **缺失依赖**:`commons-digester-2.1.jar`可能依赖于其他Apache Commons库,如`commons-...
**1. Digester的基本概念** Digester的核心思想是基于模式匹配来处理XML文档。每个XML元素对应一个处理规则,当解析到特定的XML元素时,就会执行相应的Java方法。这种机制类似于HTML解析中的事件驱动模型,只不过...
1. **引入依赖**:首先,你需要在项目的类路径中包含Apache Commons Digester的JAR文件,或者在Maven、Gradle等构建工具中添加对应的依赖。 2. **创建Digester实例**:然后,创建一个`Digester`对象,它是整个解析...
1. **什么是Digester?** Apache Commons Digester是一个Java库,它允许开发者通过定义一系列规则来解析XML文档,这些规则将XML元素与Java对象的方法或属性关联起来。这种方式使得XML数据的解析过程自动化,降低了...
1. 规则硬编码: 在硬编码方式中,开发者直接在代码中创建和设置Digester的规则。这些规则定义了如何处理XML文档中的元素和属性,例如何时创建新的Java对象,以及如何将XML数据绑定到这些对象的字段或方法。这种方式...
##### 1. 内部机制 - **SAX解析**: Digester内部采用了SAX解析器来读取XML文档。这意味着在解析过程中,不会将整个文档加载到内存中,而是通过一系列事件来逐个处理文档中的元素。 - **栈数据结构**: 在解析过程中,...
1. `Root.java`:代表XML的`root`元素。 2. `Parent.java`:代表XML的`parent`元素。 3. `Child.java`:代表XML的`child`元素。 4. `Grandchild.java`:代表XML的`grandchild`元素。 接下来,我们需要编写 Digester...
本文将深入探讨如何使用Apache的 Digester 库来解析XML文档,这是一款强大的工具,能够将XML数据映射到Java对象,简化了处理XML的过程。 Digester 是Apache Commons项目的一部分,它提供了一种规则驱动的方法来处理...
1. **初始化 Digester**:创建一个Digester实例,并设定基本的解析参数,如命名空间处理、错误处理等。 2. **注册 RuleSet**:根据业务需求,向Digester实例添加适当的RuleSet,这些RuleSet包含了处理XML数据的规则...
赠送jar包:commons-digester3-3.2.jar; 赠送原API文档:commons-digester3-3.2-javadoc.jar; 赠送源代码:commons-digester3-3.2-sources.jar; 赠送Maven依赖信息文件:commons-digester3-3.2.pom; 包含翻译后...