`
8366
  • 浏览: 802274 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

digester框架 将 XML->JavaBean

阅读更多

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;
 }
}
处理类
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,这样会带来很大的灵活性。

 

参考:

 

http://blog.csdn.net/terryzero/archive/2009/07/08/4332257.aspx

分享到:
评论

相关推荐

    quartz-1.6.0/commons-beanutils/commons-digester-1.7 JAR包

    Digester提供了一种从XML文档创建Java对象结构的方式,它可以根据预定义的规则集(RuleSet)自动解析XML,并调用相应的JavaBean方法,实现XML到Java对象的映射。这个库特别适用于那些XML配置文件需要转化为Java对象...

    xml与javabean的相互转换

    除了JAXB,还可以使用DOM API手动解析XML并设置JavaBean的属性,或者使用第三方库如Apache的Digester或XStream等进行转换。 在实际应用中,我们还需要关注一些细节问题,比如XML命名空间(Namespace)的处理、XML...

    java 处理xml的三种技术

    Digester是Apache软件基金会的一个开源项目,它基于SAX解析器,但提供了更高级的抽象,将XML数据转换为Java对象(JavaBean)。Digester通过匹配XML元素和属性与JavaBean的setter方法,自动创建和填充Java对象。这...

    aspectjrt、aspectjweaver、commons-beanutils、commons-digester

    这在处理XML配置文件时非常有用,例如在Spring框架中,digester被用来解析bean定义XML文件,创建和配置Java对象。使用Digester可以减少手动解析XML的繁琐工作,使代码更加简洁和可维护。 这些库在Java开发中的应用...

    commons-beanutils+chain+digester_jar包

    例如,可以先使用 Digester 解析XML配置文件,生成对应的Java对象,然后利用 BeanUtils 来处理这些对象的属性,最后通过 Chain 来定义并执行整个业务流程。这样的组合提供了强大的灵活性和可扩展性,使得开发者能够...

    digester学习笔记

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

    apache-commons源码及jar文件

    Betwixt提供将 JavaBean 映射至 XML 文档,以及相反映射的服务. Chain Chain 提供实现组织复杂的处理流程的“责任链模式”. CLI CLI 提供针对命令行参数,选项,选项组,强制选项等的简单API. Codec Codec 包含...

    commons jar包

    Digester通过定义规则集(RuleSet),可以自动将XML文档的元素映射到Java对象的创建和方法调用上。这在处理XML配置文件时特别有用,可以避免手动解析XML并构建相应的Java对象。开发者可以定义一系列匹配模式,当解析...

    struts1.2-jars.rar 所有jar包

    2. `commons-digester.jar`:Apache Commons Digester,用来解析XML配置文件,创建和配置Java对象。 3. `commons-fileupload.jar`:Apache Commons FileUpload,处理HTTP请求中的文件上传功能。 4. `commons-logging...

    struts-1.3.10-all

    8. **commons-digester-1.8.jar**:Apache Commons Digester库,用于读取XML文档,并根据预定义的规则自动创建和初始化Java对象。 9. **commons-validator-1.3.1.jar**:Apache Commons Validator,提供了数据验证...

    common组件包jar包

    本篇将详细探讨"common组件包"中的jar包,包括`commons-beanutils-1.8.0.jar`、`commons-collections-3.2.1.jar`、`commons-digester-1.8.jar`以及`commons-logging.jar`。 1. **commons-beanutils-1.8.0.jar**:...

    commons所有jar包

    3. **commons-betwixt-0.8.zip**:Betwixt是一个对象到XML绑定工具,它可以自动将Java对象序列化为XML,并从XML反序列化回对象,帮助开发者处理XML数据。 4. **commons-lang-2.4-bin.zip**:Lang提供了一些在Java...

    struts所需材料

    8. **commons-digester.jar**:用于XML配置文件的解析,Struts的配置文件如struts-config.xml和tiles-defs.xml就是通过这个库解析的。 9. **commons-lang.jar**:提供了一些实用的Java语言工具类,Struts框架在很多...

    struts常用包

    - **commons-digester.jar**:XML解析工具,用于读取和解析struts-config.xml配置文件。 - **commons-fileupload.jar**:文件上传支持,处理HTTP多部分请求,常用于上传文件功能。 - **commons-validator.jar**:...

    struts-1.2.5-lib.zip

    - `commons-digester.jar`:用于XML文件的解析,常用于读取struts-config.xml配置文件。 开发者在使用Struts 1.2.5时,需要结合struts-config.xml配置文件来设置Action、ActionForm、ActionMapping等元素。同时,还...

    jqgrid and java

    - `commons-digester.jar`:Apache Commons Digester允许基于XML模式的规则来构建对象图。 - `commons-validator.jar`:Apache Commons Validator提供表单验证功能。 这些库在Java项目中扮演着重要角色,比如在处理...

    myself mybatis

    10. **commons-digester-2.1.jar** - Commons Digester允许从XML文档创建Java对象图,尽管MyBatis主要使用XML来定义SQL映射,但这个库在某些场景下也可能与MyBatis的配置文件解析有关。 总之,"myself mybatis"这个...

    struts开发包

    - `commons-digester`: 用于解析XML配置文件,生成Java对象,常用于Struts的配置解析。 - `commons-fileupload`: 处理HTTP请求中的文件上传功能,使得用户可以上传文件到服务器。 - `commons-logging`: 提供日志...

    struts jar包

    3. **commons-digester.jar**:Apache Commons Digester库允许程序通过XML文档创建和配置Java对象。在Struts中,它主要用于解析struts-config.xml配置文件,创建和配置Action及其它组件。 4. **commons-validator....

    java开发常用的jar包的作用解释.pdf

    commons-digester.jar 能方便地将 XML 文档所定义的元素转化为 JAVA 对象,例如将 XML 文件转换为 Java 对象、将 Java 对象转换为 XML 文件等等。 4. commons-lang.jar commons-lang.jar 扩展了标准 java.lang API...

Global site tag (gtag.js) - Google Analytics