为了方便这篇文章仍然使用第一篇的XML和Bean。 第一篇实现了SaxCatalogUnmarshaller, 利用SAX技术将XML转成一个装配好的Java Object. 但是其中有很多需要改进的地方。 最明显需要改进的就是有大量的if-else来匹配刚读进来的XML元素, 如果XML中大量不同的类对应, 将会有更多的if-else而且不可重用。 对于大量if-else, 策略模式是一个很好的选择。
apache 的 Digester正是利用了策略模式来解决这个问题, 当SAX产生startElement, endElement等事件的时候, 马上将事件分配给匹配的Rule。 客户端只需要注册不同的模式和它们的对应关系,剩下来的事情转发给各不同的Rule实现。
Digester最开始使用的是Struts, 使用后发现非常好且通用. Digester被提到commons.apache.org.
apache Digester中 实现的Rule:ObjectCreateRule.begin代码:
/**
* Process the beginning of this element.
*
* @param attributes The attribute list of this element
*/
public void begin(Attributes attributes) throws Exception {
// 识别类名
// Identify the name of the class to instantiate
String realClassName = className;
if (attributeName != null) {
String value = attributes.getValue(attributeName);
if (value != null) {
realClassName = value;
}
}
if (digester.log.isDebugEnabled()) {
digester.log.debug("[ObjectCreateRule]{" + digester.match +
"}New " + realClassName);
}
// 实现类并将实例放到堆栈中
// Instantiate the new object and push it on the context stack
Class clazz = digester.getClassLoader().loadClass(realClassName);
Object instance = clazz.newInstance();
digester.push(instance);
}
end代码
/**
* Process the end of this element.
*/
public void end() throws Exception {
Object top = digester.pop();
if (digester.log.isDebugEnabled()) {
digester.log.debug("[ObjectCreateRule]{" + digester.match +
"} Pop " + top.getClass().getName());
}
}
上面start和end代码, 和SaxCatalogUnmarshaller比较可以看出, 对XML元素的对比,类实现和对内容堆栈的处理都封装出来了,客户端无需关注这些技术细节。
客户端只需要将不同的模式和不同的Rule对应的注册到Digester里,分发和实现就可以交给Digester和不同的Rule做了。
DigesterDriver.java:
package benewu.gmail.study.tomcat.digester;
import java.io.File;
import java.net.URL;
import org.apache.commons.digester.Digester;
public class DigesterDriver {
public static void main( String[] args ) {
try {
Digester digester = new Digester();
digester.setValidating( false );
//The patterns must match XML elements, based on their name and location in the document tree.
//The syntax used to describe the matching patterns resembles the XPath match patterns, a little:
//the pattern catalog matches the top-level <catalog> element,
//the pattern catalog/book matches a <book> element nested directly inside a <catalog> element
/*ObjectCreateRule: 利用默认构造函数创建类实例并且压到堆栈,
*元素结束的时候会从堆栈pop出来.
*/
digester.addObjectCreate( "catalog", Catalog.class );
digester.addObjectCreate( "catalog/book", Book.class );
/*
* BeanPropertySetterRule: 将名字属性赋值给栈顶的元素
* (Example: <page>10</page>.)
*/
digester.addBeanPropertySetter( "catalog/book/author", "author" );
digester.addBeanPropertySetter( "catalog/book/title", "title" );
/*
* SetNextRule: pop栈顶实例并且利用定义的方法传递给下个对象实例, 通常用来将一个完整的bean插到父对象上.
*/
digester.addSetNext( "catalog/book", "addBook" );
digester.addObjectCreate( "catalog/magazine", Magazine.class );
digester.addBeanPropertySetter( "catalog/magazine/name", "name" );
digester.addObjectCreate( "catalog/magazine/article", Article.class );
/*
* SetPropertiesRule: 将名字属性的值赋给栈顶对象.
* (Typically used to handle XML constructs like <article page="10">.)
*/
digester.addSetProperties( "catalog/magazine/article", "page", "page" );
digester.addBeanPropertySetter( "catalog/magazine/article/headline" );
digester.addSetNext( "catalog/magazine/article", "addArticle" );
digester.addSetNext( "catalog/magazine", "addMagazine" );
URL fileURL = DigesterDriver.class.getResource("catalog.xml");
File input = new File(fileURL.getFile());
Catalog c = (Catalog)digester.parse( input );
System.out.println( c.toString() );
} catch( Exception exc ) {
exc.printStackTrace();
}
}
}
DigesterDriver 实现了和SaxCatalogUnmarshaller完全相同的功能, 但更加灵活和可扩展。
这里使用的Rule有:
ObjectCreateRule, SetPropertiesRule, BeanPropertySetterRule, SetNextRule, 在代码中已经做了注释。
下节我将分析Tomcat中使用到和自己实现的部分Rule, 和典型应用。
参考:
1 The Hidden Gems of Jakarta Commons
http://www.onjava.com/pub/a/onjava/2004/12/22/jakarta-gems-1.html?page=2
2 Parsing, indexing, and searching XML with Digester and Lucene
http://www.ibm.com/developerworks/java/library/j-lucene/
3 Learning and Using Jakarta Digester
http://www.onjava.com/pub/a/onjava/2002/10/23/digester.html?page=1
- 描述: Digester, Rules关系图
- 大小: 13.1 KB
分享到:
- 2007-11-27 10:33
- 浏览 3343
- 评论(1)
- 论坛回复 / 浏览 (0 / 5101)
- 查看更多
相关推荐
标题“利用commons-digester解析XML”涉及到的是Java开发中的一种处理XML文档的工具——Apache Commons Digester。这个库提供了一种方便的方式来映射XML文档结构到Java对象,从而简化了XML数据的处理过程。 Apache ...
Java XML解析中的Digester是一个强大的工具,用于将XML文档转换为Java对象。它最初是为了处理Struts框架的配置文件而设计的,随着时间的发展,它成为一个轻量级且高效的框架,专注于单向转换,即从XML到Java对象。...
在Tomcat7的启动过程中,涉及到很多内部组件的初始化,其中`Digester`是一个重要的工具,用于解析XML配置文件,将XML结构映射为Java对象。本篇文章将深入剖析`Digester`的使用以及它在Tomcat7启动过程中的作用。 `...
Java中的Digester库是Apache Commons项目的一部分,它提供了一种方便的方式来解析XML文档,并将解析结果映射到Java对象模型上。这个库特别适合于创建简单的XML到Java对象的映射,而不需要编写大量的手动解析代码。在...
Digester 是 Apache Commons 中的一个工具类库,它用于解析 XML 文档,并根据预先定义的规则自动创建和配置 Java 对象。在上述问题中,我们看到一个 XML 文档表示了一个考试,其中包含了多个题目,每个题目有其编号...
Apache Digester是一个强大的Java库,专门用于将XML文档解析成对象模型。在处理XML到Java对象映射时,它提供了一种简洁的方式,避免了手动编写大量繁琐的XML解析代码。这个工具尤其适用于那些需要频繁从XML配置文件...
Apache Commons Digester是Java中一个强大的工具,它提供了方便的方式来解析XML文档,并将解析出的数据绑定到Java对象上,实现对象的自动创建和初始化。本示例将详细介绍如何使用Apache Commons Digester进行XML解析...
**Digester** 是Apache Commons项目中的一个子项目,主要用于简化XML文档的解析工作。它建立在SAX的基础之上,通过定义一系列的模式(Pattern)和规则(Rule),能够有效地处理复杂的XML结构,从而简化开发者的编程...
### 使用Digester解析XML文档示例 #### 一、Digester简介与应用场景 ...通过本篇示例的学习,读者可以了解到Digester的基本使用方法及其在实际开发中的应用,从而更好地利用这一工具解决XML解析问题。
2. **设置解析器**:将XML解析器(如SAXParser)与Digester关联,以便在解析XML时触发已设定的规则。 3. **解析XML**:使用`parse`方法,传入XML文件的输入流,开始解析过程。 4. **处理结果**:解析完成后,根...
本文将深入探讨如何使用Apache的 Digester 库来解析XML文档,这是一款强大的工具,能够将XML数据映射到Java对象,简化了处理XML的过程。 Digester 是Apache Commons项目的一部分,它提供了一种规则驱动的方法来处理...
在Java开发中,Struts框架提供了一个强大的工具——Digester,用于解析XML文件并自动创建、配置Java对象。本文将详细介绍如何使用Digester处理具有嵌套结构的XML文档,并通过一个具体的实例——"DigesterXmlTest"来...
本文将深入探讨如何使用Digester解析XML文件,以及在实际项目中如何应用。 首先,让我们了解什么是Apache Commons Digester。这是一个Java库,它的主要功能是读取XML文件,并基于一系列预先定义的规则(Rule),...
不错的解析XML的类,主要利用org.apache.commons.digester.Digester;
本篇文章将深入探讨如何使用Digester和`rule.xml`配置文件来解析自定义的XML文件。 首先,让我们了解什么是Apache Digester。Digester是一个开源库,它提供了从XML到Java对象的映射功能。通过定义一系列的“消化...
《digester解析XML详解》 在Java开发中,XML作为一种数据交换格式,广泛应用于配置文件、数据传输等场景。为了方便地将XML文档解析为Java对象,Apache组织提供了一个名为Digester的工具库,它允许开发者通过规则来...
本篇文章将深入探讨如何使用Digester进行XML解析,并提供相关的学习资源。 【描述】:“Digester读取XML学习” Digester的使用基于一系列预定义或自定义的规则,这些规则决定了XML文档的元素与Java对象之间的映射...
本篇文章将详细介绍如何使用`Digester`解析XML,以及在使用过程中需要的依赖库。 首先,`Digester`的核心功能是通过定义规则来将XML元素与Java对象的属性或方法关联,这样在解析XML时,可以自动创建和填充Java对象...
- **对象创建与填充**:在解析过程中,遇到匹配的XML元素时, Digester会根据规则创建新的Java对象,并将其添加到当前对象模型中,或者调用已存在对象的方法来处理数据。 3. **主要类和方法** - **Digester类**:...