digester组件简化了xml文件处理操作,能将xml文件按照事先确定的规则(采用编码形式或xml配置文件形式),映射成java对象。digester组件现在最新版本是2.0,它所依赖的组件是:commons-logging(推荐1.1版本),BeanUtils(推荐1.8版本),还有需要jdk1.5.
基本概念
1. 在Digester的内部采用SAX来解析XML文件。为了能够正确的使用它,必须在解析之前进行相应的设置。同时,在解析xml文件的过程中,它使用Stack来保存和检索这个期间产生的对象.
2. 为了简化使用,它通过匹配模式来定位要解析的xml标签。匹配模式的例子如下:
<?xml version="1.0"?> <students> <student> <name>Tom</name> <course>JSP</course> </student> <student> <name>Mary</name> <course>J2EE</course> </student> </students>
每个标签与相应的匹配模式对应如下表:
标签 匹配模式
<students> students
<student> students/student
<name> students/student/name
<course> students/student/course
3. 使用匹配模式可以很方便的定位需要处理的元素,为了处理这些元素,需要定义处理规则。规则在匹配模式被找到时起作用。所有的规则都是从org.apache.commons.digester.Rule派生的。所有已定义的Rule对象,可以在org.apache.commons.digester中找到。
常用的规则:
- ObjectCreate,创建对象实例。
- SetProperties,将标签属性(Attribute)与要创建的对象的属性相关联。
- BeanPropertySetter,将标签所包含标签与要创建的对象的属性相关联。
- SetNext,设置遇到下一个标签时的动作。
- CallMethod,设置当匹配模式被找到时要调用的方法。
- CallParam,设置对应的callMethod中指定方法所需要的参数值。
基本使用
以正确的顺序调用Digester方法是成功使用Digester处理XML文件的关键。使用步骤如下:
1. 创建org.apache.commons.digester.Digester实例并配置,包括设置实现Digester Rule的对象。
2. 使用Digester的push方法在Digester使用的stack中放置一个初始对象。在解析xml文件的过程中,Digester使用stack来保存它所找到的对象。第一个对象在遇到第一个标签时被放置到stack中,当最后一个标签处理完毕时被弹出。为了最后能检索到这个对象,因此需要一个初始对象来保留一个指向它的引用。
3. 注册匹配模式和rule。
4. 调用parse来解析xml文件。
使用举例
1.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <students> <student> <name>Tom</name> <course>JSP</course> </student> <student> <name>Mary</name> <course>J2EE</course> </student> </students>
2.硬编码形式实现
Student类
package com.tongda.whl.digester; public class Student { private String name; private String course; public void setName(String name){ this.name=name; } public void setCourse(String course){ this.course=course; } public String getName(){ return this.name; } public String getCourse(){ return this.course; } }
处理类
package com.tongda.whl.digester; import org.apache.commons.digester.*; import org.apache.commons.logging.*; import java.io.IOException; import java.util.Vector; import org.apache.commons.digester.xmlrules.*; import org.xml.sax.SAXException; public class DigestTest { private Log log=LogFactory.getLog(this.getClass()); private Vector students; public DigestTest(){ students= new Vector(5); } public void addStudent( Student student){ students.add( student); } public String toString(){ return ((Student)students.get(0)).getName(); } public void digest(){ //digest2.0支持jdk1.5,并且依赖 logging 1.1.1 和 beanutils 1.8.0 //创建实例 Digester digester= new Digester(); //将初始对象压入digester的stack digester.push( this); //指明匹配模式和要创建的类 digester.addObjectCreate( "students/student", Student.class); //设置对象属性 // digester digester.addBeanPropertySetter( "students/student/name"); digester.addBeanPropertySetter( "students/student/course"); //当移动到下一个标签中时的动作 digester.addSetNext( "students/student", "addStudent"); try { //解析,xml文件放在classpath下 DigestTest ds= (DigestTest)digester.parse( getClass().getClassLoader().getResourceAsStream( "students.xml")); log.info(ds); } catch (Exception e) { e.printStackTrace(); } } public static void main(String args[]){ DigestTest test=new DigestTest(); test.digest(); } }
结果显示:Tom
3.配置文件方式实现
配置文件:studentsRule.xml
<?xml version="1.0" encoding="UTF-8"?> <digester-rules> <pattern value="students"> <object-create-rule classname="com.tongda.whl.digester.Students" /> <set-properties-rule /> <pattern value="student"> <object-create-rule classname="com.tongda.whl.digester.Student" /> <bean-property-setter-rule pattern="name" /> <bean-property-setter-rule pattern="course" /> <set-next-rule methodname="addStudent" /> </pattern> </pattern> </digester-rules>
Student类
package com.tongda.whl.digester; public class Student { private String name; private String course; public void setName(String name){ this.name=name; } public void setCourse(String course){ this.course=course; } public String getName(){ return this.name; } public String getCourse(){ return this.course; } } Students类 package com.tongda.whl.digester; import java.util.Vector; public class Students { private Vector students; public Students(){ students= new Vector(5); } public void addStudent( Student student){ students.add( student); } public String toString(){ return ((Student)students.get(0)).getName(); } }
处理类
package com.tongda.whl.digester; import org.apache.commons.digester.*; import org.apache.commons.logging.*; import java.io.IOException; import java.util.Vector; import org.apache.commons.digester.xmlrules.*; import org.xml.sax.SAXException; public class DigestTest { private Log log=LogFactory.getLog(this.getClass()); public void digestByConfig(){ Digester digester = DigesterLoader.createDigester(this.getClass().getClassLoader().getResource("studentsRule.xml")); try { Students a= (Students)digester.parse( this.getClass().getClassLoader().getResourceAsStream("students.xml")); System.out.println(a); log.info(a); } catch (IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } } public static void main(String args[]){ DigestTest test=new DigestTest(); test.digestByConfig(); } }
结果显示:Tom
注意
在使用Digester需要注意的地方:
- 调用顺序,正确的调用顺序才能得出正确的结果。方法调用顺序基本和标签在xml文件中的层次关系相对应。基本的顺序是:先创建对象;然后设置属性;随后处理子元素;最后设置遇到下一个元素所对应的动作。对于子元素的处理,是同样的过程。
- 正确的使用初始对象。对比上面2个例子,之所以在第一个例子中显示的调用了digester的push方法,其原因就在于我们并没有如第二个例子一样用xml的root元素创建一个实例。如果不显式的调用,我们将会丢失这个元素的引用,那么也就无法得到后续的对象。
- digester的addSetNex方法中所指定的方法实际上是包含匹配模式对应标签的父标签对应对象的方法。在上两个例子中addStudent,都是包含Student对象的那个对象的方法。对于第一个例子,是DigesterTest;对于第二个例子,是Students。而且它的位置通常是在创建对象语句组的最后,与addObjectCreate相对应。在这2个语句之间的代码中所指定的方法都是所创建对象的方法。而且它们的顺序与匹配模式所对应的标签的顺序必须是一致的。
- 使用配置文件来创建digester,这样会带来很大的灵活性。
相关推荐
标题“利用commons-digester解析XML”涉及到的是Java开发中的一种处理XML文档的工具——Apache Commons Digester。这个库提供了一种方便的方式来映射XML文档结构到Java对象,从而简化了XML数据的处理过程。 Apache ...
Digester 是 Apache Commons 中的一个工具类库,它用于解析 XML 文档,并根据预先定义的规则自动创建和配置 Java 对象。在上述问题中,我们看到一个 XML 文档表示了一个考试,其中包含了多个题目,每个题目有其编号...
在Java开发中,Struts框架提供了一个强大的工具——Digester,用于解析XML文件并自动创建、配置Java对象。本文将详细介绍如何使用Digester处理具有嵌套结构的XML文档,并通过一个具体的实例——"DigesterXmlTest"来...
在Digester解析XML时,BeanUtils可以用来方便地读取和设置Java对象的属性值,使得数据绑定更加灵活。 使用这些库,开发者可以创建一个XML配置文件,定义XML结构与Java对象之间的映射规则。例如,XML文件中的每个`...
本文将深入探讨如何使用Digester解析XML文件,以及在实际项目中如何应用。 首先,让我们了解什么是Apache Commons Digester。这是一个Java库,它的主要功能是读取XML文件,并基于一系列预先定义的规则(Rule),...
4. **解析XML文件**:使用Digester解析XML文件,并根据定义的规则创建Java对象。 #### 五、总结 通过上述介绍可以看出,Digester是一个非常有用的工具,它可以大大简化XML解析的过程。在实际开发中,尤其是处理...
这个"digester解析XML文件实例"是一个很好的学习资源,帮助开发者理解如何在实际项目中运用Digester。 首先,我们要了解Digester的基本工作原理。Digester通过定义一系列规则(Rules),当解析到XML文档中特定的...
这个“org.apache.commons.digester解析XML.rar”压缩包包含了一个测试工程,它演示了如何使用Digester库来解析XML文件并映射到Java对象上。下面将详细介绍这个库的功能、使用方法以及在实际开发中的应用。 1. **...
### Digester解析XML知识点详解 #### 一、Digester简介 **Digester** 是Apache Commons项目中的一个子项目,主要用于简化XML文档的解析工作。它建立在SAX的基础之上,通过定义一系列的模式(Pattern)和规则(Rule...
5. **解析XML**:最后,使用配置好的 Digester 对象解析XML文件: ```java Root root = null; try (InputStream is = new FileInputStream("path_to_xml_file.xml")) { root = digester.parse(is); } catch ...
在示例代码中, DigesterDriver演示了如何配置 Digester来解析XML文件,创建`Catalog`对象并填充其`Book`和`Magazine`子对象,以及相关的`Article`对象。每个元素的属性通过`addBeanPropertySetter()`设置,而对象...
**Digester** 是Apache Commons项目中的一个库,它专门用于解析XML文档,并基于规则将其转换为Java对象。Digester通过匹配XML元素结构来调用对象的方法或创建新对象,减少了手动解析XML的复杂性。这在配置驱动的Java...
《digester解析XML详解》 在Java开发中,XML作为一种数据交换格式,广泛应用于配置文件、数据传输等场景。为了方便地将XML文档解析为Java对象,Apache组织提供了一个名为Digester的工具库,它允许开发者通过规则来...
首先,`Digester`的核心功能是通过定义规则来将XML元素与Java对象的属性或方法关联,这样在解析XML时,可以自动创建和填充Java对象。例如,XML中的每个元素可以对应一个Java对象,而元素的属性可以设置到对应的对象...
Java中的Digester库是Apache Commons项目的一部分,它提供了一种方便的方式来解析XML文档,并将解析结果映射到Java对象模型上。这个库特别适合于创建简单的XML到Java对象的映射,而不需要编写大量的手动解析代码。在...
**使用Digester解析XML并验证** 1. **设置 Digester 规则** 在使用Digester之前,我们需要定义一系列规则,告诉Digester在遇到XML文档的哪些元素时执行什么操作。这些规则通常涉及到创建新对象、设置对象属性或者...
《使用Digester解析XML的深度指南》 在Java开发中,处理XML文件是常见的任务,而Apache Commons Digester库提供了一种高效且便捷的方式来解析XML并将其映射到Java对象。本教程将深入探讨如何使用Digester来读取XML...