`
mreay
  • 浏览: 80817 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Digester学习笔记(一)(转)

阅读更多

在windows下开发程序,用M$提供的接口处理.ini文件或管理 注册表的键值是非常方便的。在java平台上开发程序,则习惯于以xml格式的文件来存放系统的配置信息,对这种文件的解析和处理,可以用sax或 dom。有没有更简便的方法呢?有,就是用digester模块。
  Digester是Jakarta 子项目Commons下的一个模块,支持基于规则的对任意XML文档的处理。它最初是Structs项目的一部分,后因其通用性而划归Commons.

下载及编译


  Digester的运行依赖下列包:
  1. 一个遵循Jaxp(1.1版本及以后)的XML解析器
  2. Jakarta commons beanutils包(1.5版本及以后)
  3. Jakarta commons collections包(2.1版本及以后)
  4. Jakarta commons logging包(1.0.2版本及以后)
 

一个简单的例子

  假定有两个JavaBean如下,分别为Foo和Bar

  用下面的xml文件进行配置

  用下面几行代码即可完成配置文件解析工作:
Digest解析代码注释
Digester digester = new Digester();
digester.setValidating(false);不进行XML与相应的DTD的合法性验证
digester.addObjectCreate("foo", "mypackage.Foo");当遇到<foo>时创建一个mypackage.Foo对象,并将其放在栈顶
digester.addSetProperties("foo");根据<foo>元素的属性(attribute),对刚创建的Foo对象的属性(property)进行设置
digester.addObjectCreate("foo/bar", "mypackage.Bar");当遇到<foo>的子元素<bar>时创建一个mypackage.Bar对象,并将其放在栈顶。
digester.addSetProperties("foo/bar");根据<bar>元素的属性(attribute),对刚创建的Bar对象的属性(property)进行设置
digester.addSetNext("foo/bar", "addBar", "mypackage.Bar");当再次遇到<foo>的子元素<bar>时创建一个mypackage.Bar对象,并将其放在栈顶,同时调用第二栈顶元素(Foo对象)的addBar方法。
Foo foo = (Foo) digester.parse();分析结束后,返回根元素。

基本情况

  熟悉用SAX来处理XML文档的程序员,会发现Digester隐藏了遍历XML元素这些细节,而是提供了更高一层的、更友好的SAX事件接口,从而让程序员的精力放在对数据的处理过程中。
  使用Digester,须按照以下步骤:
  1. 创建一个org.apache.commons.digester.Digester实例。一个解析请求完成后,这个Digester可以被后面复用。但也不要试图在不同的线程中从共享一个Digester实例。
  2. 根据需要设置一些配置属性(configuration properties),以控制下一步的解析操作。
  3. 将一个或几个初始对象(initial object)压入Digester对象栈,本步骤不是必须的。
  4. 注册所有的元素匹配模板(elemet matching pattern)。当一个模板被从输入文档中识别出来以后,与其相联系的处理规则(processing rules)被激活。对一个特定的模板,可以定义任意多的规则,当识别出该模板后,这些规则依序依次执行。
  5. 调用digester.parse()方法,一个XML文档的引用(用多种方式供选择)要传给这个方法。注意,需要捕捉并处理IOException或SAXEception或处理过程中抛出的异常。

元素匹配模板

  Digester能自动遍历目标XML文档的元素形成的层次结构,这个过程无需程序员参与。程序员的任务是决定,在解析的过程中,当由嵌套的元素形成的一个特定序列被识别出时,如何处理它。用以描述这种序列的机制,就叫“元素匹配模板”。
  具体说来,元素和其子元素间,用”/”相隔,如果一些元素前没有”/”则其必为根元素。如例:

  字符”*”表示任意级别,如”*/a”表示任意级别的<a>都可匹配(不包括根元素级的).熟悉XLST的朋友,对这种思路一定不陌生。
  从上面的描述,可知某个元素同时满足多个匹配模板是非常可能的,在这种情况下,与各个模板相关联的处理规则(processing rule)的执行顺序如下:对begin或body方法,按照各个rule的注册顺序的先后,对end方法则是注册顺序的反序。

处理规则(processing rule)

  元素匹配模板用以识别什么时候采取行动,处理规则则用以定义行动的内容。
   从形式上讲,一个处理规则是一个java类,它扩展了org.apache.commons.digester.Rule类。每个处理规则,实现下列的 一个或几个事件处理方法(event method),当相应的模板匹配成功以后,在已定义的某个时刻,这些事件方法会被触发。
  1. begin(),在一个匹配元素被识别出后的“开始”时刻被调用,这个元素的所有属性放在一个数据结构中被传递给begin()
  2. body(),当元素的嵌套内容(如子元素)被识别出时被调用。在解析的过程中,前后的空白被去掉了
  3. end(),匹配元素的“结束”时刻被调用。如果子元素也匹配相关的规则,则这些规则的方法需都执行毕,才能达到该元素的“结束”时刻。
  4. finish(),解析结束时被调用,以提供给各个规则以清理临时数据的机会。

  在设置digester时,通过调用addRule()方法,来注册一个特定的元素匹配模板以及相应的一个Rule类的实例。如上所述,Rule类中的事件处理方法,会在适当的时间被调用。这个机制,允许动态地生成Rule的实现。
  另外,digester也提供了一些处理常见情况的处理规则类。
  1. ObjectCreateRule, 当begin()方法被调用时,这个规则类实例化一个指定的java类,并将其压入栈顶。这个被实例化的类的名字,默认是这个规则类构造函数得到的参数, 也可以通过指定正在处理的xml元素的属性来传递一个新的类的名字。当end()方法被调用 时,栈顶的对象被弹出,Digester中对它的任何引用将 被忽略。
  2. FactoryCreateRule,一个非常有用的ObjectCreateRule的变体。
  3. SetPropertiesRule, 当begin()方法被调用时,digester使用标准的Java Relection API来识别JavaBean的属性设置方法(setter method),这些方法名称中包含属性(property)的名字,这些属性与XML元素的属性(attribute)匹配,于是这些方法被调用并将相 应的属性值(attribute value)传给它们。这些自然的映射可以被重写。建议不要过度使用这项功能,在大多数情况下,使用标准的BeanInfo机制会更好。
  4. SetPropertyRule, 当begin()方法被调用时,digester调用栈顶对象的一个特定的属性设置方法(property setter)并传给它特定的值(property和值分别由两个attribute命名)。这对XML需要遵循一个指定的DTD时比较有用,你可以设置 一个特别的属性(property),虽然在指定DTD没有attribute与其相对应。
  5. SetNextRule, 当end()方法被调用时,digester分析第二栈顶元素,寻找一个特定属性(property)的设置方法(setter method),并接着调用这个方法,以栈顶的元素作参数。这个规则通常用来在两个对象间建立1对多的关系,所用的方法也常被叫做addChild什么 的。
  6. SetTopRule,当end()方法被调用时,digester分析栈顶元 素,寻找一个特定属性(property)的设置方法(setter method),并接着调用这个方法,以第二栈顶的元素作参数。这个规则通常用来在两个对象间建立1对多的关系,所用的方法也常被叫做setParent 什么的。
  7. CallMethodRule,这个规则设置当end()被调用时执行的栈顶对象的自定义方法,通过对这个规则的设置,来指定方法的名字、参数的数量以及定义的参数类型的Java类的名字。实际的参数值,来自激活这个方法的元素的子元素。
  8. CallParamRule,这个规则用来指定CallMethodRule的参数的值的来源,它可以来自一个特定的属性,或子元素的body的内容.
  9. NodeCreateRule,一个特殊的规则,将对象树的一部分转换成一个DOM结点(Node),并压入栈顶。

  对这些标准的规则类,可以创建它们的实例,并调用digester.addRule来注册它们。由于经常使用它们,所以digester定义了一些简便的方法来注册它们。如:
可以用下列代码替换


分享到:
评论

相关推荐

    Digester笔记

    Digester是Jakarta项目的Commons子项目之一,主要功能在于提供了一种简单易用的方式来解析XML文档。通过使用Digester,开发者能够避免处理复杂的SAX事件流,使得XML解析过程更加直观和高效。 #### 什么是Digester?...

    digester学习笔记

    Apache Commons Digester 是一个用于处理XML文档的Java库,它允许开发者通过定义一系列规则来将XML数据映射到Java对象的属性或者创建新的Java对象。这个库特别适用于配置文件的解析,因为它简化了从XML到Java对象...

    Jakarta-Common-Digester使用笔记

    Digester不是一个XML Parser,它只是对SAX更高层次上的一个封装使用Digester,将XML映射成javaBean. 我们无须了解SAX和DOM的解析过程,只要给Digester添加一些解析规则,就能对一个xml文件进行解析。Digester使用...

    Digester读取XML学习

    【标题】:“Digester读取XML学习” 在Java开发中,处理XML文件... Digester的学习是一个从理论到实践的过程,通过不断的实践和理解,可以更有效地将XML数据转化为可操作的Java对象,从而提高代码的可维护性和灵活性。

    利用digester来将xml转换为bean

    示例源代码下载 博文链接:https://bazhuang.iteye.com/blog/188518

    利用Digester把XML转换成为Java对象

    2. **创建Digester实例**:接着,我们需要创建一个`Digester`实例,并对其进行配置。 3. **配置Digester**: - **设置对象创建规则**:通过`addObjectCreate`方法指定当解析到`&lt;chart&gt;`元素时,创建一个`...

    Digester

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

    Digester学习

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

    Castor、digester实例

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

    digester用法测试案例

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

    Digester java解析xml

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

    digester(浅谈第一次使用)

    在第一次使用Digester时,开发者通常会经历学习如何设置规则、关联XML元素和Java类以及处理解析过程中的事件。 在“浅谈第一次使用”的描述中,可能涵盖了博主初次尝试使用Digester时的经验和遇到的问题,以及逐步...

    digester使用

    Apache Commons Digester是Apache软件基金会提供的一个强大的工具,专门用于将XML文档解析为Java对象。它通过定义一系列规则,实现了从XML到Java对象的映射,大大简化了开发过程,提高了代码的可读性和可维护性。 *...

    commons-digester.jar

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

    Apache xml转换java对象 Digester

    为了方便地将XML数据转换为Java对象,Apache Commons库提供了一个强大的工具——`Digester`。本文将详细介绍如何利用`Digester`结合基于XML的规则集来实现这一转换过程。 #### 二、Apache Commons Digester简介 `...

    利用commons-digester解析xml

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

    Digester读取xml教程.rar

    在Java开发中,处理XML文件是常见的任务,而Apache Commons Digester库提供了一种高效且便捷的方式来解析XML并将其映射到Java对象。本教程将深入探讨如何使用Digester来读取XML文件,帮助你更好地理解和应用这一强大...

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

    为了更高效地管理XML数据,Apache Commons项目提供了一种名为**Digester**的组件,它能够简化XML文件的处理操作,并将XML文件映射为Java对象,极大地提高了开发效率。 #### 二、Digester组件概述 **Digester**是...

Global site tag (gtag.js) - Google Analytics