Digester学习笔记
作者:kongxx
简介
Digester是Apache组织下的一个子项目(jakarta/commons/),主要功能是通过读取XML文件来初始化Java对象。
目前项目的版本是1.6,网站地址http://jakarta.apache.org/commons/digester。
一个小例子
此例子来源于Digester的官方网站,在这里做了一点修改。
本例子包括两个JavaBean(Foo和Bar),一个xml文件和一个测试类。
Foo.java
package test1;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Foo {
private String name;
private Map bars = new HashMap();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void addBar(Bar bar) {
if(bar == null) {
throw new IllegalArgumentException("The bar is null!");
}
bars.put(bar.getId() ,bar);
}
public Bar findBar(String id) {
return (Bar)bars.get(id);
}
public Iterator getBars() {
return bars.values().iterator();
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("Foo:").append(name).append("/n");
for(Iterator i = getBars() ; i.hasNext();) {
sb.append("/t").append((Bar)i.next()).append("/n");
}
return sb.toString();
}
}
|
Bar.java
package test1;
public class Bar {
private String id ;
private String title ;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("Bar[").append("id:").append(id).append(",title:").append(title).append("]"); return sb.toString();
}
}
|
test.xml
<?xml version="1.0" encoding="GB2312"?>
<foo name="The Parent">
<bar id="first" title="The First Child" />
<bar id="second" title="The Second Child" />
</foo>
|
Test.java
package test1;
import java.io.InputStream;
import org.apache.commons.digester.Digester;
public class Test {
public static void main(String[] args) throws Exception {
Digester digester = new Digester();
digester.setValidating(false);
digester.addObjectCreate("foo", Foo.class);
digester.addSetProperties("foo");
digester.addObjectCreate("foo/bar", Bar.class);
digester.addSetProperties("foo/bar");
digester.addSetNext("foo/bar", "addBar", Bar.class.getName());
InputStream is =
Test.class.getResourceAsStream("/test1/test.xml");
Foo foo = (Foo) digester.parse(is);
System.out.println(foo.toString());
}
}
|
运行Test后输出如下:
Foo:The Parent
Bar[id:first,title:The First Child]
Bar[id:second,title:The Second Child]
|
下面来简要看一下Digester的处理流程,如下;
Ø 创建一个org.apache.commons.digester.Digester
对象实例,如
Digester digester = new Digester();。
Ø 设置Digester
属性,如:
digester.setValidating(false);。
Ø 将需要初始化的对象压入Digester对象栈中(可选操作)。
Ø 注册所有符合模版(Patterns)的需要处理的元素,如:
digester.addObjectCreate("foo", Foo.class);
digester.addSetProperties("foo");
digester.addObjectCreate("foo/bar", Bar.class);
digester.addSetProperties("foo/bar");
digester.addSetNext("foo/bar", "addBar", Bar.class.getName());
Ø 执行解析操作来解析XML Document并返回一个对象堆栈的根对象,如:Foo foo = (Foo) digester.parse(is);。
对象栈
通常我们使用Digester主要是用来构造一个树型的Java对象。我们可以使用一些处理规则来解析XML文档,当发现符合规则的元素的开始位置时创建一个对象并将其压入对象栈中,然后继续解析直到发现第一个结束位置,此时弹出创建的对象。
元素匹配模式
Digester另一个主要特性是元素匹配模式。例如在第一个例子中的xml文件内容:
节点(元素) |
匹配模式 |
<foo name="The Parent">
<bar id="first" title="The First Child" />
<bar id="second" title="The Second Child" />
</foo>
|
Foo |
foo/bar |
foo/bar |
|
此外,Digester也可以使用“*”来匹配特殊的节点,如“*/bar”可以匹配任意节点下的bar节点。
处理规则
在Digester中每一个处理规则都是一个继承了org.apache.commons.digester.Rule类的Java类。
处理操作:
方法 |
说明 |
begin() |
在一个元素被匹配后的开始位置调用 |
body() |
元素的嵌套内容(如子元素)被识别出时被调用 |
end() |
在一个元素被匹配后的开始位置调用 |
finish() |
解析结束时被调用 |
常用处理规则:
规则名 |
说明 |
ObjectCreateRule |
创建一个新对象并将其压入对象栈中,当元素解析完毕,再从对象栈中弹出。要求创建的类有默认构造函数。 |
FactoryCreateRule |
创建一个新对象并将其压入对象栈中,当元素解析完毕,再从对象栈中弹出。和ObjectCreateRule的区别是此规则主要处理要构造的类没有默认构造函数的情况。 |
SetPropertiesRule |
设置对象属性并将其压入对象栈顶部。 |
SetPropertyRule |
设置一个对象属性并将其压入对象栈顶部。 |
SetNextRule |
调用倒数第二级(Top-1,或父对象)对象的方法,并且将顶级(Top或子对象)对象作为参数。此规则主要用来处理父子关系的对象。通常是类似“addChild”的方法。 |
SetTopRule |
调用顶部位置子对象的类似“setParent”的方法,使用(Top-1)对象作为参数。 |
CallMethodRule |
调用栈中对象(通常是栈顶对象)的方法,使用后续的CallParamRule 规则或者元素中的body作为参数。 |
CallParamRule |
用来指定CallMethodRule的参数的值的来源,它可以来自一个特定的属性,或子元素的body的内容. |
NodeCreateRule |
将对象树的一部分转化为DOM的一个节点。 |
递归遍历例子
此例子是典型的递归遍历xml文档的例子。例如:在组织机构中的部门,每个部门都可以有上级部门,也可以有下级部门,因此部门的xml描述如下:
<?xml version="1.0" encoding="GB2312"?>
<departments>
<department id="1" name="name1">
<department id="11" name="name11">
<department id="111" name="name111">
</department>
</department>
<department id="12" name="name12">
</department>
<department id="13" name="name13">
</department>
</department>
<department id="2" name="name2">
<department id="21" name="name21">
</department>
<department id="22" name="name22">
</department>
<department id="23" name="name23">
</department>
</department>
</departments>
|
俩个JavaBean类和一个测试类如下:
Departments.java 对应xml文档中的根节点(departments)
package test3;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Departments {
private List children = new ArrayList();
public List getChildren() {
return children;
}
public void setChildren(List children) {
this.children = children;
}
public void addChild(Department d) {
this.children.add(d);
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("/n");
sb.append("<departments>/n");
for(Iterator i = children.iterator() ; i.hasNext() ;) {
Department d = (Department)i.next();
sb.append(d.toString());
}
sb.append("</departments>/n");
return sb.toString();
}
}
|
Department.java对应具体的一个部门节点
package test3;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Department {
private String id;
private String name;
private Department parent;
private Set children = new HashSet();
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 Department getParent() {
return parent;
}
public void setParent(Department parent) {
this.parent = parent;
}
public Set getChildren() {
return children;
}
public void setChildren(Set children) {
this.children = children;
}
public void addChild(Department d) {
this.children.add(d);
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("<department id=/"").append(id).append("/"");
sb.append(" name=/"").append(name).append("/">/n");
for(Iterator i = children.iterator() ; i.hasNext() ;) {
Department d = (Department)i.next();
sb.append(d.toString());
}
sb.append("</department>/n");
return sb.toString();
}
}
|
测试代码如下:
package test3;
import java.io.InputStream;
import org.apache.commons.digester.Digester;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Test {
private static Log log = LogFactory.getLog(Test.class);
public static void main(String[] args) throws Exception {
test1();
}
private static void test1() throws Exception {
InputStream is = Test.class.getResourceAsStream("/test3/department.xml");
Digester digester = new Digester();
digester.setValidating(false);
digester.addObjectCreate("departments", Departments.class);
digester.addSetProperties("departments");
digester.addObjectCreate("*/department", Department.class);
digester.addSetProperties("*/department");
digester.addSetNext("*/department","addChild",Department.class.getName());
Departments ds = (Departments) digester.parse(is);
log.info(ds.toString());
}
}
|
运行程序,输出如下:
<departments>
<department id="1" name="name1">
<department id="12" name="name12">
</department>
<department id="11" name="name11">
<department id="111" name="name111">
</department>
</department>
<department id="13" name="name13">
</department>
</department>
<department id="2" name="name2">
<department id="23" name="name23">
</department>
<department id="21" name="name21">
</department>
<department id="22" name="name22">
</department>
</department>
</departments>
|
分享到:
相关推荐
Apache Commons Digester 是一个用于处理XML文档的Java库,它允许开发者通过定义一系列规则来将XML数据映射到Java对象的属性或者创建新的Java对象。这个库特别适用于配置文件的解析,因为它简化了从XML到Java对象...
Digester不是一个XML Parser,它只是对SAX更高层次上的一个封装使用Digester,将XML映射成javaBean. 我们无须了解SAX和DOM的解析过程,只要给Digester添加一些解析规则,就能对一个xml文件进行解析。Digester使用...
在学习过程中,你可以从“Digester笔记”系列文档开始,了解基本的XML解析和对象绑定。然后,尝试阅读“文件合并必读”,探索如何处理复杂的XML结构。实践部分,可以通过解压并研究两个Web应用示例,理解在实际项目...
《Digester学习详解》 Apache Digester 是一个用于解析XML文档并将其映射到Java对象的工具,尤其在处理配置文件或对象关系映射时,它能极大地简化工作流程。这个强大的工具允许开发者通过规则来定义XML元素如何映射...
Digester是Apache软件基金会下的Jakarta项目中的一个Java库,主要用于简化XML到Java对象的映射过程。在处理XML文档时,它通过匹配XML元素结构到相应的Java对象的方法调用,实现了XML解析的自动化。这个工具对于那些...
Castor和Digester是两个在Java开发中用于对象与XML数据之间进行映射的库,它们简化了XML数据的解析和...通过上述实例,你应该对如何使用Castor和Digester有了基本的理解,但要完全掌握它们,还需要进一步的实践和学习。
Digester是Apache软件基金会的Jakarta项目中的一个实用工具库,它主要用来解析XML文档,并根据预定义的规则自动创建和配置Java对象。这个工具在处理XML到Java对象映射时,极大地简化了代码,避免了手动解析XML的繁琐...
Java中的Digester库是Apache Commons项目的一部分,它提供了一种方便的方式来解析XML文档,并将解析结果映射到Java对象模型上。这个库特别适合于创建简单的XML到Java对象的映射,而不需要编写大量的手动解析代码。在...
赠送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; 包含翻译后...
`commons-digester.jar`是Apache Commons项目中的一个组件,主要功能是解析XML文档并根据预定义的规则自动创建和填充Java对象。这个组件在Java应用程序中尤其有用,特别是那些需要从XML配置文件中构建复杂对象层次...
《digester深度解析》 Java世界中,XML作为数据交换和配置文件的常用格式,其解析和对象绑定是一项常见的任务。Apache Commons Digester是Apache软件基金会提供的一个强大的工具,专门用于将XML文档解析为Java对象...
`commons-digester-2.1.jar` 是Apache Commons项目中的一个组件,主要负责XML文档的解析和对象的创建与绑定。Apache Commons Digester库提供了一种规则驱动的方法来解析XML文档,并根据预定义的规则将XML数据映射到...
标题“利用commons-digester解析XML”涉及到的是Java开发中的一种处理XML文档的工具——Apache Commons Digester。这个库提供了一种方便的方式...通过深入学习和使用,可以提升开发效率,并更好地管理项目中的XML资源。
《使用Digester解析XML的深度指南》 在Java开发中,处理XML文件是常见的任务,而Apache Commons Digester库提供了一种高效且便捷的方式来解析XML并将其映射到Java对象。本教程将深入探讨如何使用Digester来读取XML...
在Java开发中,Apache Commons Digester是一个非常有用的库,它允许开发者通过XML配置来实例化、配置和关联Java对象。 Digester提供了两种主要的解析方式,即规则硬编码和独立的规则文件,这两种方法各有其特点和...
### Digester组件简化XML文件处理操作 #### 一、引言 随着Web技术的发展,XML作为数据交换格式的重要性日益凸显。然而,对于大型且复杂的XML文档进行解析与处理时,传统的方法如DOM(Document Object Model)和SAX...
本文将深入探讨如何使用Apache的 Digester 库来解析XML文档,这是一款强大的工具,能够将XML数据映射到Java对象,简化了处理XML的过程。 Digester 是Apache Commons项目的一部分,它提供了一种规则驱动的方法来处理...
《digester3.2源码解析与应用实例》 Apache Digester是一个强大的Java库,用于在XML文档和Java对象之间建立映射关系,通过规则来自动解析XML并创建或更新对象结构。在digester3.2版本中,我们能够深入理解其内部...