`
8366
  • 浏览: 802148 次
  • 性别: 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

分享到:
评论

相关推荐

    java 处理xml的三种技术

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

    digester学习笔记

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

    apache-commons源码及jar文件

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

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

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

    apache web组件使用

    - **Digester**:解析XML文档,并根据预定义的规则自动创建和配置Java对象。 - **Jelly**:基于标签库的脚本语言,用于生成XML或Java代码。 - **JXPath**:使用XPath表达式在Java对象模型(如Map和JavaBean)中...

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

    commons-digester.jar 的作用是提供了一个方便的方式来将 XML 文档转换为 Java 对象,简化了开发者的工作。 4. Commons-lang.jar: commons-lang.jar 扩展了标准 java.lang API,增加了字符串操作方法、基本数值...

    常用的jar包简单介绍

    7. **commons-digester.jar**: 用于将XML文档映射到Java对象,简化了从XML配置文件创建Java对象的过程。 8. **commons-fileupload.jar**: 实现了文件上传功能,常用于Web应用中接收用户上传的文件。 9. **commons-...

    commons包介绍1

    11. **Digester**: Digester组件可以将XML文档映射到Java对象,常用于解析XML配置文件,实现对象的自动创建和初始化。 12. **Discovery**: Commons-Discovery提供了定位资源和服务的工具,支持通过不同的模式映射...

    javaweb项目中常用的jar包详解.pdf

    11. Commons-digester.jar:这是一个 Common 项目中用来解析 XML 的工具包,提供了从 XML 到 JavaBean 的映射。相较于传统的 W3C、SAX 方式解析 XML 文档,Digester 的层次更高,适合更懒得家伙。 12. Commons-...

    JAKARTA COMMONS

    3. **Commons Betwixt**: 用于将 JavaBean 映射到 XML 文档,并支持反向映射,方便 Java 对象与 XML 数据之间的转换。 4. **Commons Chain**: 实现了设计模式中的“责任链模式”,允许构建复杂的处理流程,每个处理...

Global site tag (gtag.js) - Google Analytics