前段時間項目中需要根據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
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;
- }
- }
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
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;
- }
- }
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
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;
- }
- }
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
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;
- }
- }
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,包含了學生(包含了課程),老師
Java代碼

- <?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>
<?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對象.
============================================================
Java代碼

- 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>
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
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();
- }
- }
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的常用法.