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
[code]
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;
}
}
[/code]
============================================================
2.学生 Student.java
[code]
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;
}
}
[/code]
============================================================
3.老师 Teacher.java
[code]
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;
}
}
[/code]
============================================================
4.课程 Course.java
[code]
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;
}
}
[/code]
三.基础XML文件
============================================================
学院 academy.xml,包含了学生(包含了课程),老师
[code]
<?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>
[/code]
============================================================

四.Digester Class
DigestXMLJavaAcademy.java 和academyRules.xml
其中academyRules.xml用来定义xml文件和java对象的匹配(映射)关系,格式要符合digester-rules.dtd格式约束
DigestXMLJavaAcademy.java 根据academyRules.xml解析academy.xml文件并生成 Academy对象.
============================================================
[code]
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>
[/code]
============================================================
2. DigestXMLJavaAcademy.java
[code]
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();
}
}
[/code]
五.运行结果
自己运行吧,呵呵

六.后记
写下来还真得花点时间呢,不过这也是对自己以前思路的一个整理.
写出来与大家共同分享也是一种乐趣.呵呵.
下次有时间写一篇关于cglib的常用法.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:错误原因:缺少依赖包:commons-digester.jar包。解决办法:向maven包管理器下的pom.xml文件添加依赖: <!-- https://mvnrepository.com/artifact/commons-digester/commons-digester --> <dependency> <groupId>commons-digester</groupId> <artifactId>commons-digester</artifactId> <version>1.8</version> </dependency>。\[1\] 引用\[3\]:Apache commons digester组件简介说明,digester组件简化xml文件处理操作,能将xml文件预先定义的规则(采用编码形式或xml配置文件形式)映射成java对象。\[3\] 根据提供的引用内容,org/apache/commons/digester3/digester是指Apache commons digester组件的类路径。如果你遇到了这个错误,可能是因为缺少了commons-digester.jar包。你可以通过向maven的pom.xml文件添加上述的依赖来解决这个问题。\[1\] Apache commons digester组件是一个用于简化处理XML文件的工具,它可以根据预先定义的规则将XML文件映射成Java对象。\[3\] #### 引用[.reference_title] - *1* [java.lang.NoClassDefFoundError: org/apache/commons/digester/RuleSet 错误原因是缺少j相应jar包](https://blog.csdn.net/Sunshine_Dawn/article/details/80436180)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Apache commons digester简介说明](https://blog.csdn.net/qq_25073223/article/details/127439162)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值