`
Mr.Benny
  • 浏览: 28695 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Digester学习(摘自digester_百度百科)

阅读更多
digester简介
    Digester本来仅仅是Jakarta Struts中的一个工具,用于处理struts-config.xml配置文件。显然,将XML文件转换成相应的Java对象是一项很通用的功能,这个工具理应具有更广泛的用途,所以很快它就在Jakarta Commons项目(用于提供可重用的Java组件库)中有了一席之地。    
    如今Digester随着Struts的发展以及其的公用性而被提到commons中独自立项,是apache的一个组件 apache commons-digester.jar,通过它可以很方便的从xml文件生成java对象.你不用再象以前通过jdom或者Xerces去读取一个document对象.(jdom和Xerces仍然有它们的用武之地及强大之处,在其它应用里你也少不了它们) 。


digester工作原理
    Digester由"事件"驱动,通过调用预定义的规则操作对象栈,将XML文件转换为Java对象。工作原理如下:   
    Digester底层采用SAX解析XML文件,所以很自然的,对象转换由"事件"驱动,即在识别出特定XML元素时(实际被细分为begin、body、end、finish四个时点),将执行特定的动作,比如创建特定的Java对象,或调用特定对象的方法等。此处的XML元素根据匹配模式(matching pattern)识别,而相关操作由规则(rule)定义。在转换过程中,Digester维持了一个对象栈,可以看作对象转换的工作台,用来存放转换中生成的、或是为转换临时创建的Java对象。对输入XML文件作了一趟完整的扫描后,对象栈的栈顶元素即为目标对象。由于Digester屏蔽了SAX解析的细节,使用者仅需关注转换操作本身,大大简化了转换操作。


digester的核心
    对使用者而言,Digester的核心在于匹配模式与规则(matching pattern + rule)。
    匹配规则示例如下:   
           <a> -- Matches pattern "a"   
               <b> -- Matches pattern "a/b"   
                   <c/> -- Matches pattern "a/b/c"   
                   <c/> -- Matches pattern "a/b/c"   
               </b>   
               <b> -- Matches pattern "a/b"   
                   <c/> -- Matches pattern "a/b/c"   
                   <c/> -- Matches pattern "a/b/c"   
                   <c/> -- Matches pattern "a/b/c"   
               </b>   
           </a>   
    Digester提供了一些编程中经常用到的规则(rule),以下五类九个rule较为常用:
    A:对象创建   
    1.ObjectCreateRule 当begin()方法被调用时, 此rule创建相应Java对象, 并将其push到Digester的对象栈上。当end()方法被调用时, 栈顶对象将被pop, Digester内所有对该对象的引用都将失效。   
    2.FactoryCreateRule 创建Java对象的另一种选择。当待创建的Java对象没有无参构造函数,或需要在创建时需要进行额外的设置时,需要用此rule。   
    B:属性设置   
    3.SetPropertiesRule 当begin()方法被调用时, Digester使用标准的Java反射API,将栈顶对象的属性设置为XML元素的同名属性值。   
    4.SetPropertyRule 当begin()方法被调用时, Digester调用栈顶对象某指定属性的设置方法,设置其值。   
    C:父子关系管理   
    5.SetNextRule 当end()方法被调用时, Digester将栈顶元素设置进次栈顶元素中(调用相应的设置方法)。   
    6.SetTopRule 当end()方法被调用时, Digester将次栈顶元素设置进栈顶元素中(调用相应的设置方法)。   
    D:任意方法调用   
    7.CallMethodRule 当end()方法被调用时, Digester将调用栈顶元素指定名称的方法。除了方法名外,此rule还需要配置参数数目,参数类型。参数值一般通过CallParamRule得到。   
    8.CallParamRule 此rule内嵌于CallParamRule中,按顺序(相对于0)定义了CallParamRule中参数值的来源,可选的来源包括当前XML元素的属性或内容。   
    E:其它   
    9.NodeCreateRule 将XML文件树的一部分转换为DOM节点,并push到Digester的对象栈上。


digester使用方法
    使用者通过调用Digester类的相关方法,来创建匹配模式与规则的映射序列。   
    比如,调用addSetProperties(String pattern),向Digester中加入SetPropertiesRule。   
    基本步骤如下:   
    1.创建Digester对象实例。   
    2.设置该Digester对象的配置属性(可选)。   
    3.将需要的初始对象push到该Digester对象的对象栈上(可选)。   
    4.需要注册所有的XML元素匹配模式与处理规则之间的映射关系。   
    5.用digester.parse()解析的XML文档对象,得到目标对象。

简单示例
  1.foo.xml 数据源文件   
    2.Foo.java 目标Java对象   
    3.Bar.java 目标Java对象   
    4.Entry.java 调用Digester的入口类

【foo.xml】
  <?xml version="1.0" encoding="GBK"?>   
    <foo name="The Parent">   
        <bar id="123" title="The First Child"/>   
        <bar id="456" title="The Second Child"/>   
    </foo> 


【Foo.java】
package org.easev.digester;

import java.util.HashMap;
import java.util.Iterator;

public class Foo {
	private String name;

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

	public String getName() {
		return name;
	}

	private HashMap bars = new HashMap();

	public void addBar(Bar bar) {
		bars.put(String.valueOf(bar.getId()), bar);
	}

	public Bar findBar(int id) {
		return (Bar) bars.get(String.valueOf(id));
	}

	public Iterator getBars() {
		return bars.keySet().iterator();
	}
}


【Bar.java】
package org.easev.digester;

public class Bar {
	private int id;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	private String title;

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}
}


【Entry.java】
package org.easev.digester;

import java.io.File;
import java.util.Iterator;
import org.apache.commons.digester.Digester;

public class Entry {
	public static void main(String[] args) throws Exception {
		// 相对路径定义与包名相关
		File input = new File("org/easev/digester/foo.xml");
		Digester digester = new Digester();
		digester.setValidating(false);
		// 完整类名定义,包名改变时需做相应变化
		digester.addObjectCreate("foo", "org.easev.digester.Foo");
		digester.addSetProperties("foo");
		digester.addObjectCreate("foo/bar", "org.easev.digester.Bar");
		digester.addSetProperties("foo/bar");
		digester.addSetNext("foo/bar", "addBar", "org.easev.digester.Bar");
		Foo foo = (Foo) digester.parse(input);
		// 测试装载是否成功 Iterator iter = foo.getBars();
		while (iter.hasNext()) {
			System.out.println((String) iter.next());
		}
	}
}


    匹配模式没有什么文章好做,那么下面要讨论的就必然是规则了。在基本的使用方式下,Digester虽然使用XML文件定义Java对象的状态,提高了系统的灵活性,但是匹配模式与规则的映射序列(装载逻辑)仍然通过硬编码来定义,这种方式不易修改与重用。所以Digester还提供了一种高级的使用方式,用一个XML文件定义Java对象的状态(数据源文件),用另一个XML文件定义装载数据源文件的装载逻辑。   
    这样,对象的装载过程分成了两步:   
    1.装载逻辑的"装载",其结果表现为定义了rule的Digester;   
    2.根据上一步得到的Digester,装载目标对象。

    套用上面的一个例子,增加了rule.xml,并改写了Entry.java

【rule.xml】
<?xml version='1.0'?>   
<!DOCTYPE digester-rules   PUBLIC "-//Jakarta Apache //DTD digester-rules XML V1.0//EN"   "file:///../digester/dtds/digester-rules.dtd">   
<digester-rules>   
   <pattern value="foo">   
        <object-create-rule classname="org.easev.digester.Foo"/>   
        <set-properties-rule/>   
    <pattern value="bar">   
        <object-create-rule classname="org.easev.digester.Bar"/>   
        <set-properties-rule/>   
        <set-next-rule methodname="addBar"/>   
    </pattern>   
    </pattern>   
</digester-rules> 


【Entry.java】
package org.easev.digester;

import java.io.File;
import java.util.Iterator;
import org.apache.commons.digester.Digester;

public class Entry {
	public static void main(String[] args) throws Exception {
		// 相对路径定义与包名相关
		File data = new File("org/easev/digester/foo.xml");
		File rule = new File("org/easev/digester/rule.xml");
		Digester digester = DigesterLoader.createDigester(rule.toURL());
		Foo foo = (Foo) digester.parse(data);
		// 测试装载是否成功
		Iterator iter = foo.getBars();
		while (iter.hasNext()) {
			System.out.println((String) iter.next());
		}
	}
}


    我们可以看到,使用Digester的代码变得相当简洁,而要付出的代价就是为装载逻辑写一个配置文件。   
    除了Digester之外,当然还有其它的方法来实现Java对象的绑定与装载:
  1.java.util.Properties,简单的配置属性(比如数据库连接信息),可以写在properties文件中,调用Properties对象的load(InputStream)方法将配置中的健值对加载到Properties对象中。这种方式一般仅适用于简单的配置信息的加载。
  2.JAXB,Java Architecture for XML Binding,在Java Web Services Developer Pack V 1.1中提供了一个参考实现。使用这种方式时,除了提供数据源XML文件之外,还必须提供相应的Schema文件。加载前,首先用Binding Compiler将Schema转换得到目标Java类的接口与实现,然后再调用Unmarshaller或Marshaller将数据源XML文件信息加载到Java对象中,或将设置的Java对象数据导出为XML文件。   
    3.XPath   
    4.JaxMe
分享到:
评论

相关推荐

    digester-python.rar_python xml to soap

    一个用Python实现的将XML源文件转化成Python对象结构的转换器。使用时请将转化规则写到config.xml文件中。使用该程序后可以避免每次都写...参见http://commons.apache.org/digester/,本程序是这个工程的Python版本!

    使用Apache_Commons_Digester

    ### 使用Apache Commons Digester开发指南 #### 概述 Apache Commons Digester 是一款基于 Java 的开源库,专门用于简化 XML 文件解析的过程。它利用 SAX(Simple API for XML)解析器来解析 XML 数据,并通过一...

    Digester读取XML学习

    【标题】:“Digester读取XML学习” 在Java开发中,处理XML文件是常见的任务,尤其是在构建配置驱动的应用程序时。Apache Commons Digester是一个强大的工具,它允许开发者将XML文件解析为Java对象,通过匹配XML...

    commons-digester3-3.2-API文档-中英对照版.zip

    赠送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; 包含翻译后...

    Castor、digester实例

    Castor和Digester是两个在Java开发中用于对象与XML数据之间进行映射的库,它们简化了XML数据的解析和...通过上述实例,你应该对如何使用Castor和Digester有了基本的理解,但要完全掌握它们,还需要进一步的实践和学习。

    Digester

    Digester是Apache软件基金会下的Jakarta项目中的一个Java库,主要用于简化XML到Java对象的映射过程。在处理XML文档时,它通过匹配XML元素结构到相应的Java对象的方法调用,实现了XML解析的自动化。这个工具对于那些...

    Digester学习

    《Digester学习详解》 Apache Digester 是一个用于解析XML文档并将其映射到Java对象的工具,尤其在处理配置文件或对象关系映射时,它能极大地简化工作流程。这个强大的工具允许开发者通过规则来定义XML元素如何映射...

    commons-digester.jar

    `commons-digester.jar`是Apache Commons项目中的一个组件,主要功能是解析XML文档并根据预定义的规则自动创建和填充Java对象。这个组件在Java应用程序中尤其有用,特别是那些需要从XML配置文件中构建复杂对象层次...

    commons-digester-2.1.jar

    `commons-digester-2.1.jar` 是Apache Commons项目中的一个组件,主要负责XML文档的解析和对象的创建与绑定。Apache Commons Digester库提供了一种规则驱动的方法来解析XML文档,并根据预定义的规则将XML数据映射到...

    digester用法测试案例

    Digester是Apache软件基金会的Jakarta项目中的一个实用工具库,它主要用来解析XML文档,并根据预定义的规则自动创建和配置Java对象。这个工具在处理XML到Java对象映射时,极大地简化了代码,避免了手动解析XML的繁琐...

    利用commons-digester解析xml

    标题“利用commons-digester解析XML”涉及到的是Java开发中的一种处理XML文档的工具——Apache Commons Digester。这个库提供了一种方便的方式来映射XML文档结构到Java对象,从而简化了XML数据的处理过程。 Apache ...

    Digester java解析xml

    Java中的Digester库是Apache Commons项目的一部分,它提供了一种方便的方式来解析XML文档,并将解析结果映射到Java对象模型上。这个库特别适合于创建简单的XML到Java对象的映射,而不需要编写大量的手动解析代码。在...

    Java_XML解析之Digester的使用

    Java XML解析中的Digester是一个强大的工具,用于将XML文档转换为Java对象。它最初是为了处理Struts框架的配置文件而设计的,随着时间的发展,它成为一个轻量级且高效的框架,专注于单向转换,即从XML到Java对象。...

    digester使用

    《digester深度解析》 Java世界中,XML作为数据交换和配置文件的常用格式,其解析和对象绑定是一项常见的任务。Apache Commons Digester是Apache软件基金会提供的一个强大的工具,专门用于将XML文档解析为Java对象...

    Digester读取xml教程.rar

    《使用Digester解析XML的深度指南》 在Java开发中,处理XML文件是常见的任务,而Apache Commons Digester库提供了一种高效且便捷的方式来解析XML并将其映射到Java对象。本教程将深入探讨如何使用Digester来读取XML...

    Digester两种解析方式

    在Java开发中,Apache Commons Digester是一个非常有用的库,它允许开发者通过XML配置来实例化、配置和关联Java对象。 Digester提供了两种主要的解析方式,即规则硬编码和独立的规则文件,这两种方法各有其特点和...

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

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

    XML的解析之——使用Digester

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

    commons-digester3-3.2-API文档-中文版.zip

    赠送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; 包含翻译后...

Global site tag (gtag.js) - Google Analytics