转载:http://blog.csdn.net/terryzero/category/517681.aspx
基本概念
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;
}
}
处理类
view plaincopy to clipboardprint?
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();
}
}
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"?>
<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();
}
}
处理类
view plaincopy to clipboardprint?
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();
}
}
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需要注意的地方:
1- 调用顺序,正确的调用顺序才能得出正确的结果。方法调用顺序基本和标签在xml文件中的层次关系相对应。基本的顺序是:先创建对象;然后设置属性;随后处理子元素;最后设置遇到下一个元素所对应的动作。对于子元素的处理,是同样的过程。
2- 正确的使用初始对象。对比上面2个例子,之所以在第一个例子中显示的调用了digester的push方法,其原因就在于我们并没有如第二个例子一样用xml的root元素创建一个实例。如果不显式的调用,我们将会丢失这个元素的引用,那么也就无法得到后续的对象。
3- digester的addSetNex方法中所指定的方法实际上是包含匹配模式对应标签的父标签对应对象的方法。在上两个例子中addStudent,都是包含Student对象的那个对象的方法。对于第一个例子,是DigesterTest;对于第二个例子,是Students。而且它的位置通常是在创建对象语句组的最后,与addObjectCreate相对应。在这2个语句之间的代码中所指定的方法都是所创建对象的方法。而且它们的顺序与匹配模式所对应的标签的顺序必须是一致的。
4- 使用配置文件来创建digester,这样会带来很大的灵活性。
分享到:
相关推荐
标题“利用commons-digester解析XML”涉及到的是Java开发中的一种处理XML文档的工具——Apache Commons Digester。这个库提供了一种方便的方式来映射XML文档结构到Java对象,从而简化了XML数据的处理过程。 Apache ...
Apache Commons Digester库提供了一种规则驱动的方法来解析XML文档,并根据预定义的规则将XML数据映射到Java对象上。这个库在处理XML配置文件时特别有用,它允许开发者将XML结构转换为相应的Java对象结构,从而简化...
《Apache Commons Digester 1.7:解析XML的利器》 Apache Commons Digester是一个Java库,主要用于解析XML文档,并根据预定义的规则将其转换为Java对象。在标题和描述中提到的"commons-digester-1.7.jar.zip"是一个...
`commons-digester.jar`是Apache Commons项目中的一个组件,主要功能是解析XML文档并根据预定义的规则自动创建和填充Java对象。这个组件在Java应用程序中尤其有用,特别是那些需要从XML配置文件中构建复杂对象层次...
《Apache Commons Digester 2.0:解析XML的利器》 Apache Commons Digester是一个Java库,主要用于将XML文档解析成Java对象。这个库的核心功能是根据预定义的规则(Rule)来读取XML文档,然后根据这些规则进行一...
**Apache Commons Digester** 是一个Java库,它允许开发人员定义一套规则,这些规则可以解析XML文档,并根据这些规则在Java对象模型中创建和配置对象。这个库在处理XML到Java对象映射时非常有用,特别是在构建配置...
这个示例演示了如何使用Apache Commons Digester解析XML文件,将XML数据转换为Java对象。通过定义规则,我们可以轻松地处理复杂的XML结构,并将它们映射到Java对象模型中。这在处理大量配置数据或需要从XML文件加载...
Commons-Digester是一个Java库,它提供了一组规则来解析XML文档,并将解析结果映射到Java对象。这个库在处理XML配置文件时特别有用,因为它可以自动化将XML元素和属性转换为对象的属性和方法调用。在给定的标题...
Commons Digester是一个强大的Java库,它允许开发人员根据XML文档中的模式规则来创建和操作对象。这个"commons-digester-1.7.zip"文件包含了Apache Commons Digester库的1.7版本,这是一个广泛用于处理XML到Java对象...
Digester提供了一种从XML文档创建Java对象结构的方式,它可以根据预定义的规则集(RuleSet)自动解析XML,并调用相应的JavaBean方法,实现XML到Java对象的映射。这个库特别适用于那些XML配置文件需要转化为Java对象...
Apache Commons Digester是一个强大的Java库,主要功能是解析XML文档,并根据预定义的规则将其转换为Java对象。在标题"commons-digester-2.0.jar.zip"中,我们看到的是这个库的一个特定版本——2.0,它被压缩成一个...
3. **Digest Process**:Digester解析XML文档的过程,按照规则集执行,将XML结构转化为Java对象。 ## 三、主要功能 1. **对象创建**:根据XML元素创建对应的Java对象。例如,每当解析到特定的XML标签时,可以创建...
通过定义一系列规则,你可以控制如何将XML元素映射到Java对象的属性,这样就可以避免手动解析XML并创建对象的繁琐过程。 接下来,`commons-dbcp-1.2.2.jar`是Apache Commons Database Connection Pooling(DBCP)的...
这个开源库是Java开发人员常用的一个工具,它允许程序通过定义规则来解析XML文档,并根据这些规则进行对象的创建和属性设置。这在构建基于XML配置的系统,如Struts框架时特别有用。 Apache Commons Digester是一个...
digester必备的jar,XML解析专用
在实际应用中,Commons Digester常用于配置文件的解析,例如在Spring框架中,它被用来解析XML配置文件,创建和配置bean。此外,它也适用于任何需要根据XML结构动态生成和操作Java对象的场景。 总的来说,Commons ...
标题中的"commons-digester"是指Apache Commons项目中的一个模块,专门用于XML解析和对象绑定。这个库提供了方便的方法来将XML文档解析成...它简化了XML处理的复杂性,减少了手动解析XML的繁琐工作,提升了开发效率。