`
binker
  • 浏览: 17288 次
  • 性别: Icon_minigender_1
  • 来自: jiangsu
社区版块
存档分类
最新评论

Apache Digester应用实例 [原创]

阅读更多
前段时间项目中需要根据xml文件创建java对象,而apache commons-digester是首选.
一直想把它写下来,可是总有点懒 这次介绍一下digester的常用法,其他更高级的使用方法请参阅digester doc(由于比较忙,下次有时间写一篇关于cglib的常用法,呵呵)
Apache Digester应用实例 [原创]
--------------利用 apache commons-digester 自动根据xml文件创建java 对象
<day day up>
author: binker
email: binker_cao@163.com
date: 2006/12/16
note: 本文可以任意转载,但请保持其完整性并注明来源,谢谢.

一.序
  Digester是apache的一个组件 apache commons-digester.jar,通过它可以很方便的从xml文件生成java对象.你不用再象以前通过jdom或者Xerces去读取一个document对象.(jdom和Xerces仍然有它们的用武之地及强大之处,在其它应用里你也少不了它们)
我只是用一个例子展示一下如何把xml文件生成一个java object.
首先你必须把jar加入到你的项目classpath.
(一)准备:
1.环境: Eclipse, jdk1.4+
2.需求说明:学院包含学生和老师,学生可以选修课程,老师有不同的资格认证。
3.Java Class的定义,简洁起见,略去import内容。
4.使用Digester生成java对象 必须要定义一个xml文件,此xml文件必须符合digester-rules.dtd的规则。
5.所有的xml文件必须在classpath路径中,这样可以通过Class.getClassLoader().getInputStream()读取xml文件。

(二)提要:
  本示例所需的java class 和 xml文件分成四类:
1.基础xml文件: [academy.xml]: 你将要解析的xml文件.
2.基础java class: [Academy.java, Teacher.java, Student.java, Cousre.java]: 生成的对象的类定义
3.digesterRules.xml: [academyRules.xml]: 定义了基础xml文件到基础java class的匹配(映射)关系
4.Digester class: [DigestXMLJavaAcademy.java]: 根据digesterRules.xml去解析基础xml文件,并生成java 对象

(三)参考资料
   1.English ebook: Pro Jakarta Commons by Harshad Oak  Apress 2004

二.基础Java Class
1.学院 class Academy.java
public class Academy {
    private Vector students;
    private Vector teachers;
    private String name;

    public Academy() {
        students = new Vector();
        teachers = new Vector();
    }

    public void addStudent(Student student) {
        students.addElement(student);
    }

    public void addTeacher(Teacher teacher) {
        teachers.addElement(teacher);
    }

    public Vector getStudents() {
        return students;
    }

    public void setStudents(Vector newStudents) {
        students = newStudents;
    }
    public Vector getTeachers() {
        return teachers;
    }

    public void setTeachers(Vector newTeachers) {
        teachers = newTeachers;
    }

    public String getName() {
        return name;
    }

    public void setName(String newName) {
        name = newName;
    }
}

============================================================
2.学生 Student.java
public class Student {
    private Vector courses;
    private String name;
    private String division;

    public Student() {
        courses = new Vector();
    }

    public void addCourse(Course course) {
        courses.addElement(course);
    }

    public String getName() {
        return name;
    }
    public void setName(String newName) {
        name = newName;
    }

    public String getDivision() {
        return division;
    }

    public void setDivision(String newDivision) {
        division = newDivision;
    }

    public void setCourses(Vector courses) {
        this.courses = courses;
    }

    public Vector getCourses() {
        return courses;
    }
}

============================================================
3.老师 Teacher.java
public class Teacher {
    private String name;
    private Vector certifications;

    public Teacher() {
        certifications = new Vector();
    }

    public void addCertification(String certification) {
        certifications.addElement(certification);
    }

    public String getName() {
        return name;
    }

    public void setName(String newName) {
        name = newName;
    }

    public void setCertifications(Vector certifications) {
        this.certifications = certifications;
    }

    public Vector getCertifications() {
        return certifications;
    }
}

============================================================
4.课程 Course.java
public class Course {
    private String id;
    private String name;

    public Course() {
    }

    public String getId() {
        return id;
    }

    public void setId(String newId) {
        id = newId;
    }
    public String getName() {
        return name;
    }

    public void setName(String newName) {
        name = newName;
    }
}

三.基础XML文件
============================================================
学院 academy.xml,包含了学生(包含了课程),老师
<?xml version="1.0"?>
<academy name="JAcademy" >
         <student name="JavaBoy" division="A">
                  <course>
                      <id>C1</id>
                      <name>JSP</name>
                  </course>
                  <course>
                      <id>C2</id>
                      <name>Servlets</name>
                  </course>
         </student>
         <student name="JavaGirl" division="B">
                  <course>
                      <id>C3</id>
                      <name>EJB</name>
                  </course>
         </student>

         <teacher name="JavaGuru">
                  <certification>SCJP</certification>
                  <certification>SCWCD</certification>
         </teacher>
         <teacher name="JavaMaster">
                  <certification>OCP</certification>
                  <certification>SCJP</certification>
                  <certification>SCEA</certification>
         </teacher>
</academy>

============================================================

四.Digester Class
DigestXMLJavaAcademy.java 和academyRules.xml
其中academyRules.xml用来定义xml文件和java对象的匹配(映射)关系,格式要符合digester-rules.dtd格式约束
DigestXMLJavaAcademy.java 根据academyRules.xml解析academy.xml文件并生成 Academy对象.
============================================================
1. academyRules.xml
<?xml version="1.0"?>
<digester-rules>
  <pattern value="academy">
      <object-create-rule classname="com.commonsbook.chap7.academy.Academy" />
     <set-properties-rule />
     <pattern value="student">
         <object-create-rule classname="com.commonsbook.chap7.academy.Student" />
         <set-properties-rule />

         <pattern value="course">
             <object-create-rule classname="com.commonsbook.chap7.academy.Course" />
             <bean-property-setter-rule pattern="id"/>
             <bean-property-setter-rule pattern="name"/>
             <set-next-rule methodname="addCourse" />
         </pattern>
         <set-next-rule methodname="addStudent" />
     </pattern>

     <pattern value="teacher">
         <object-create-rule classname="com.commonsbook.chap7.academy.Teacher" />
         <set-properties-rule />
         <call-method-rule pattern="certification" methodname="addCertification"
             paramcount="1" />
         <call-param-rule pattern="certification" paramnumber="0"/>
         <set-next-rule methodname="addTeacher" />
     </pattern>
 </pattern>
</digester-rules>

============================================================
2. DigestXMLJavaAcademy.java
public class DigestXMLJavaAcademy {
    public void digest(){
        try {
            //Create Digester using rules defined in academyRules.xml
            Digester digester = DigesterLoader.createDigester(
                     this.getClass().getClassLoader().getResource("academyRules.xml"));

            //Parse academy.xml using the Digester to get an instance of Academy
            Academy a = (Academy)digester.parse(
            this.getClass().getClassLoader().getResourceAsStream("academy.xml"));

            Vector vStud=a.getStudents();
            Vector vTeach=a.getTeachers();

            for (int i = 0; i < vStud.size(); i++) {
                System.out.println("Student>> "+PropertyUtils.describe(vStud.get(i)));
            }

            for (int i = 0; i < vTeach.size(); i++) {
                System.out.println("Teacher>> "+ PropertyUtils.describe(vTeach.get(i)));
            }
         } catch(Exception e) {
             e.printStackTrace();
         }
    }

    public static void main(String[] args) {
        DigestXMLJavaAcademy xmlDigest= new DigestXMLJavaAcademy();
        xmlDigest.digest();
    }
}

五.运行结果
自己运行吧,呵呵

六.后记
写下来还真得花点时间呢,不过这也是对自己以前思路的一个整理.
写出来与大家共同分享也是一种乐趣.呵呵.
下次有时间写一篇关于cglib的常用法.
分享到:
评论
7 楼 sun113 2007-05-22  
初学者,写得不错,如果多加点注释就更好了,是吧!谢谢!
6 楼 westsince2001 2006-12-20  
还没用过呢~想尝试下
5 楼 galaxystar 2006-12-20  
还不错,不过我喜欢xerces,即方便又兼容其他平台!
4 楼 zaife 2006-12-20  
还没有用过,哪天尝试一下
3 楼 gao277 2006-12-20  
我也一直使用digester解析XML文件,但是一直觉得通过默认方式描述规则对于一般的开发人员来说还是有一些困难,现在规则文件使用javascript描述,当然格式还是xml,这样开发就简单多了
2 楼 jackhlp 2006-12-18  
digester好像就是struts中读取struts-config.xml文件的,后来脱离出来的
1 楼 dwangel 2006-12-17  
我以前用digester是直接代码拼规则的,还不知道可以用xml定义规则呢。

相关推荐

    Castor、digester实例

    下面是一个基本的Digester实例: ```java import org.apache.commons.digester.Digester; import org.xml.sax.SAXException; // 假设有UserRule类实现了必要的setter方法 public class UserRule {} // 创建和配置...

    使用Apache_Commons_Digester

    ### 使用Apache Commons Digester开发指南 #### 概述 Apache Commons Digester 是一款基于 Java 的开源库,专门用于简化 XML 文件解析的过程。它利用 SAX(Simple API for XML)解析器来解析 XML 数据,并通过一...

    Apache xml转换java对象 Digester

    ##### 3.2 创建Digester实例 接下来,我们需要创建一个`Digester`实例,并加载上面定义的规则集。这可以通过`DigesterLoader`类完成,具体代码如下: ```java import org.apache.commons.digester.Digester; import ...

    commons-digester.jar

    8. **使用示例**: 在实际应用中,首先你需要创建一个 Digester实例,然后定义并添加RuleSet。接着,调用`parse()`方法,传入XML输入源,这样Digester就会开始解析XML并执行相应的Rule,创建和填充Java对象。 例如,...

    digester 实例

    标题中的“digester 实例”指的是Apache Commons Digester库在Java开发中的应用。Apache Commons Digester是一个工具,它允许程序员指定一系列的规则,用于解析XML文档,并根据这些规则调用对象的方法来创建和配置...

    利用commons-digester解析xml

    2. **创建Digester实例**:然后,创建一个`Digester`对象,它是整个解析过程的控制器。 3. **定义规则**:使用`addRule`或`addSetProperties`等方法定义规则,将XML元素与Java对象的方法或属性关联起来。例如,`add...

    digester解析XML文件实例

    学习这个实例,你不仅能够掌握如何使用Digester解析XML,还能了解到如何设计符合XML结构的Java类,以及如何定义和组织规则。这将对你的Java开发技能和处理XML数据的能力有显著提升。同时,理解Digester也能帮助你更...

    digester使用

    - **创建Digester实例**:首先需要创建一个Digester对象,它是整个解析过程的管理者。 - **添加规则**:然后根据XML结构,添加一系列Rule,这些规则定义了如何处理XML元素。 - **注册对象工厂**(Optional):如果...

    commons-digester-1.7.jar.zip

    4. **解析XML**:使用`Digester`实例解析XML文档,它会按照规则自动创建和配置对象。 5. **处理结果**:解析完成后,Java对象结构已经构建完毕,可以进行后续的业务处理。 **许可证信息**:`commons-digester-1.7....

    XML的解析之——使用Digester

    首先,创建一个Digester实例,然后设置消化规则。这些规则将XML元素与Java对象的属性或方法关联起来。例如,我们可以这样配置规则: ```java Digester digester = new Digester(); digester.setClassLoader(Thread....

    digester3.2 源码

    2. **注册 RuleSet**:根据业务需求,向Digester实例添加适当的RuleSet,这些RuleSet包含了处理XML数据的规则集合。 3. **绑定规则**:定义XML元素到Java对象的映射,这通常通过`addRule`或`addRuleSet`方法完成。 4...

    用到digester项目,直接解析存入数据库

    在解析XML过程中,首先需要创建一个Digester实例并设置解析规则。这些规则通常使用addRule方法定义,它们指示当遇到特定的XML元素时,应该执行哪个方法或如何设置Java对象的属性。一旦解析完成,生成的对象可以通过...

    使用digester配置rule.xml规则来解析自定义的xml文件-代码

    在Java代码中,我们需要加载`rule.xml`并应用它到Digester实例上,然后解析XML文件: ```java Digester digester = new Digester(); digester.setRulesLoader(new ClassPathResourceRulesLoader("rule.xml")); ...

    Commons-digester:规则引擎全实例

    在本实例中,我们将深入探讨 Commons Digester 的核心概念、工作原理以及如何在实际项目中应用。 一、Commons Digester 概述 Commons Digester 是Apache软件基金会的一个开源项目,其核心思想是通过“消化”XML...

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

    - **创建Digester实例**: 首先需要创建一个`org.apache.commons.digester.Digester`实例,并配置必要的规则。 - **初始化对象**: 使用`push`方法向Digester使用的栈中添加一个初始对象。这是为了确保在解析过程中...

    digester解析xml必备包.rar

    总之,Apache Commons Digester是一个强大的工具,它简化了XML文档到Java对象的映射,使得在Java应用中处理XML数据变得更加便捷。结合 Commons Logging 和 Commons BeanUtils,可以实现更高效、灵活的XML解析和数据...

    commons-digester-2.1.jar.zip

    1. **创建Digester实例**:通过`new Digester()`创建。 2. **注册规则**:使用`addRuleSet`或`addRule`方法添加规则,定义XML结构和Java对象的对应关系。 3. **加载XML**:使用`parse`方法,传入XML输入流,开始...

    digester包

    1. **初始化Digester**:创建一个Digester实例,并设置必要的属性,如命名空间处理、错误处理等。 2. **定义Rule**:创建Rule对象,这些对象定义了当XML文档中的某个元素或属性出现时,应执行的操作。例如,`...

    Digester读取xml教程.rar

    使用Digester的基本步骤包括创建Digester实例、设置解析规则、然后调用`parse()`方法解析XML。 4. **规则定义** Digester的规则是通过`addRule()`方法添加的。例如,你可以使用`addRuleSet()`添加一个预定义的...

Global site tag (gtag.js) - Google Analytics