免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1927 | 回复: 1

digester使用 [复制链接]

论坛徽章:
0
发表于 2012-03-19 17:09 |显示全部楼层
digester使用








一.序
  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代码
  1. 1.public class Academy {     
  2. 2.    private Vector students;     
  3. 3.    private Vector teachers;     
  4. 4.    private String name;     
  5. 5.     
  6. 6.    public Academy() {     
  7. 7.        students = new Vector();     
  8. 8.        teachers = new Vector();     
  9. 9.    }     
  10. 10.     
  11. 11.    public void addStudent(Student student) {     
  12. 12.        students.addElement(student);     
  13. 13.    }     
  14. 14.     
  15. 15.    public void addTeacher(Teacher teacher) {     
  16. 16.        teachers.addElement(teacher);     
  17. 17.    }     
  18. 18.     
  19. 19.    public Vector getStudents() {     
  20. 20.        return students;     
  21. 21.    }     
  22. 22.     
  23. 23.    public void setStudents(Vector newStudents) {     
  24. 24.        students = newStudents;     
  25. 25.    }     
  26. 26.    public Vector getTeachers() {     
  27. 27.        return teachers;     
  28. 28.    }     
  29. 29.     
  30. 30.    public void setTeachers(Vector newTeachers) {     
  31. 31.        teachers = newTeachers;     
  32. 32.    }     
  33. 33.     
  34. 34.    public String getName() {     
  35. 35.        return name;     
  36. 36.    }     
  37. 37.     
  38. 38.    public void setName(String newName) {     
  39. 39.        name = newName;     
  40. 40.    }     
  41. 41.}   
  42.     public class Academy {  
  43.         private Vector students;  
  44.         private Vector teachers;  
  45.         private String name;  
  46.       
  47.         public Academy() {  
  48.             students = new Vector();  
  49.             teachers = new Vector();  
  50.         }  
  51.       
  52.         public void addStudent(Student student) {  
  53.             students.addElement(student);  
  54.         }  
  55.       
  56.         public void addTeacher(Teacher teacher) {  
  57.             teachers.addElement(teacher);  
  58.         }  
  59.       
  60.         public Vector getStudents() {  
  61.             return students;  
  62.         }  
  63.       
  64.         public void setStudents(Vector newStudents) {  
  65.             students = newStudents;  
  66.         }  
  67.         public Vector getTeachers() {  
  68.             return teachers;  
  69.         }  
  70.       
  71.         public void setTeachers(Vector newTeachers) {  
  72.             teachers = newTeachers;  
  73.         }  
  74.       
  75.         public String getName() {  
  76.             return name;  
  77.         }  
  78.       
  79.         public void setName(String newName) {  
  80.             name = newName;  
  81.         }  
  82.     }  
复制代码
2.学生 Student.java

Java代码
  1. 1.public class Student {     
  2. 2.    private Vector courses;     
  3. 3.    private String name;     
  4. 4.    private String division;     
  5. 5.     
  6. 6.    public Student() {     
  7. 7.        courses = new Vector();     
  8. 8.    }     
  9. 9.     
  10. 10.    public void addCourse(Course course) {     
  11. 11.        courses.addElement(course);     
  12. 12.    }     
  13. 13.     
  14. 14.    public String getName() {     
  15. 15.        return name;     
  16. 16.    }     
  17. 17.    public void setName(String newName) {     
  18. 18.        name = newName;     
  19. 19.    }     
  20. 20.     
  21. 21.    public String getDivision() {     
  22. 22.        return division;     
  23. 23.    }     
  24. 24.     
  25. 25.    public void setDivision(String newDivision) {     
  26. 26.        division = newDivision;     
  27. 27.    }     
  28. 28.     
  29. 29.    public void setCourses(Vector courses) {     
  30. 30.        this.courses = courses;     
  31. 31.    }     
  32. 32.     
  33. 33.    public Vector getCourses() {     
  34. 34.        return courses;     
  35. 35.    }     
  36. 36.}   
  37.     public class Student {  
  38.         private Vector courses;  
  39.         private String name;  
  40.         private String division;  
  41.       
  42.         public Student() {  
  43.             courses = new Vector();  
  44.         }  
  45.       
  46.         public void addCourse(Course course) {  
  47.             courses.addElement(course);  
  48.         }  
  49.       
  50.         public String getName() {  
  51.             return name;  
  52.         }  
  53.         public void setName(String newName) {  
  54.             name = newName;  
  55.         }  
  56.       
  57.         public String getDivision() {  
  58.             return division;  
  59.         }  
  60.       
  61.         public void setDivision(String newDivision) {  
  62.             division = newDivision;  
  63.         }  
  64.       
  65.         public void setCourses(Vector courses) {  
  66.             this.courses = courses;  
  67.         }  
  68.       
  69.         public Vector getCourses() {  
  70.             return courses;  
  71.         }  
  72.     }  
复制代码
3.老师 Teacher.java

Java代码
  1. 1.public class Teacher {     
  2. 2.    private String name;     
  3. 3.    private Vector certifications;     
  4. 4.     
  5. 5.    public Teacher() {     
  6. 6.        certifications = new Vector();     
  7. 7.    }     
  8. 8.     
  9. 9.    public void addCertification(String certification) {     
  10. 10.        certifications.addElement(certification);     
  11. 11.    }     
  12. 12.     
  13. 13.    public String getName() {     
  14. 14.        return name;     
  15. 15.    }     
  16. 16.     
  17. 17.    public void setName(String newName) {     
  18. 18.        name = newName;     
  19. 19.    }     
  20. 20.     
  21. 21.    public void setCertifications(Vector certifications) {     
  22. 22.        this.certifications = certifications;     
  23. 23.    }     
  24. 24.     
  25. 25.    public Vector getCertifications() {     
  26. 26.        return certifications;     
  27. 27.    }     
  28. 28.}   
  29.     public class Teacher {  
  30.         private String name;  
  31.         private Vector certifications;  
  32.       
  33.         public Teacher() {  
  34.             certifications = new Vector();  
  35.         }  
  36.       
  37.         public void addCertification(String certification) {  
  38.             certifications.addElement(certification);  
  39.         }  
  40.       
  41.         public String getName() {  
  42.             return name;  
  43.         }  
  44.       
  45.         public void setName(String newName) {  
  46.             name = newName;  
  47.         }  
  48.       
  49.         public void setCertifications(Vector certifications) {  
  50.             this.certifications = certifications;  
  51.         }  
  52.       
  53.         public Vector getCertifications() {  
  54.             return certifications;  
  55.         }  
  56.     }  
复制代码
4.课程 Course.java

Java代码
  1. 1.public class Course {     
  2. 2.    private String id;     
  3. 3.    private String name;     
  4. 4.     
  5. 5.    public Course() {     
  6. 6.    }     
  7. 7.     
  8. 8.    public String getId() {     
  9. 9.        return id;     
  10. 10.    }     
  11. 11.     
  12. 12.    public void setId(String newId) {     
  13. 13.        id = newId;     
  14. 14.    }     
  15. 15.    public String getName() {     
  16. 16.        return name;     
  17. 17.    }     
  18. 18.     
  19. 19.    public void setName(String newName) {     
  20. 20.        name = newName;     
  21. 21.    }     
  22. 22.}   
  23.     public class Course {  
  24.         private String id;  
  25.         private String name;  
  26.       
  27.         public Course() {  
  28.         }  
  29.       
  30.         public String getId() {  
  31.             return id;  
  32.         }  
  33.       
  34.         public void setId(String newId) {  
  35.             id = newId;  
  36.         }  
  37.         public String getName() {  
  38.             return name;  
  39.         }  
  40.       
  41.         public void setName(String newName) {  
  42.             name = newName;  
  43.         }  
  44.     }  
复制代码
三.基础XML文件
============================================================
学院 academy.xml,包含了学生(包含了课程),老师

Java代码
  1. 1.<?xml version="1.0"?>     
  2. 2.<academy name="JAcademy" >     
  3. 3.         <student name="JavaBoy" division="A">     
  4. 4.                  <course>     
  5. 5.                      <id>C1</id>     
  6. 6.                      <name>JSP</name>     
  7. 7.                  </course>     
  8. 8.                  <course>     
  9. 9.                      <id>C2</id>     
  10. 10.                      <name>Servlets</name>     
  11. 11.                  </course>     
  12. 12.         </student>     
  13. 13.         <student name="JavaGirl" division="B">     
  14. 14.                  <course>     
  15. 15.                      <id>C3</id>     
  16. 16.                      <name>EJB</name>     
  17. 17.                  </course>     
  18. 18.         </student>     
  19. 19.     
  20. 20.         <teacher name="JavaGuru">     
  21. 21.                  <certification>SCJP</certification>     
  22. 22.                  <certification>SCWCD</certification>     
  23. 23.         </teacher>     
  24. 24.         <teacher name="JavaMaster">     
  25. 25.                  <certification>OCP</certification>     
  26. 26.                  <certification>SCJP</certification>     
  27. 27.                  <certification>SCEA</certification>     
  28. 28.         </teacher>     
  29. 29.</academy>   
  30.     <?xml version="1.0"?>  
  31.     <academy name="JAcademy" >  
  32.              <student name="JavaBoy" division="A">  
  33.                       <course>  
  34.                           <id>C1</id>  
  35.                           <name>JSP</name>  
  36.                       </course>  
  37.                       <course>  
  38.                           <id>C2</id>  
  39.                           <name>Servlets</name>  
  40.                       </course>  
  41.              </student>  
  42.              <student name="JavaGirl" division="B">  
  43.                       <course>  
  44.                           <id>C3</id>  
  45.                           <name>EJB</name>  
  46.                       </course>  
  47.              </student>  
  48.       
  49.              <teacher name="JavaGuru">  
  50.                       <certification>SCJP</certification>  
  51.                       <certification>SCWCD</certification>  
  52.              </teacher>  
  53.              <teacher name="JavaMaster">  
  54.                       <certification>OCP</certification>  
  55.                       <certification>SCJP</certification>  
  56.                       <certification>SCEA</certification>  
  57.              </teacher>  
  58.     </academy>  
复制代码
四.Digester Class
DigestXMLJavaAcademy.java 和academyRules.xml
其中academyRules.xml用来定义xml文件和java对象的匹配(映射)关系,格式要符合digester-rules.dtd格式约束
DigestXMLJavaAcademy.java 根据academyRules.xml解析academy.xml文件并生成 Academy对象.

Java代码
  1. 1.1. academyRules.xml     
  2. 2.<?xml version="1.0"?>     
  3. 3.<digester-rules>     
  4. 4.  <pattern value="academy">     
  5. 5.      <object-create-rule classname="com.commonsbook.chap7.academy.Academy" />     
  6. 6.     <set-properties-rule />     
  7. 7.     <pattern value="student">     
  8. 8.         <object-create-rule classname="com.commonsbook.chap7.academy.Student" />     
  9. 9.         <set-properties-rule />     
  10. 10.     
  11. 11.         <pattern value="course">     
  12. 12.             <object-create-rule classname="com.commonsbook.chap7.academy.Course" />     
  13. 13.             <bean-property-setter-rule pattern="id"/>     
  14. 14.             <bean-property-setter-rule pattern="name"/>     
  15. 15.             <set-next-rule methodname="addCourse" />     
  16. 16.         </pattern>     
  17. 17.         <set-next-rule methodname="addStudent" />     
  18. 18.     </pattern>     
  19. 19.     
  20. 20.     <pattern value="teacher">     
  21. 21.         <object-create-rule classname="com.commonsbook.chap7.academy.Teacher" />     
  22. 22.         <set-properties-rule />     
  23. 23.         <call-method-rule pattern="certification" methodname="addCertification"     
  24. 24.             paramcount="1" />     
  25. 25.         <call-param-rule pattern="certification" paramnumber="0"/>     
  26. 26.         <set-next-rule methodname="addTeacher" />     
  27. 27.     </pattern>     
  28. 28. </pattern>     
  29. 29.</digester-rules>   
  30.     1. academyRules.xml  
  31.     <?xml version="1.0"?>  
  32.     <digester-rules>  
  33.       <pattern value="academy">  
  34.           <object-create-rule classname="com.commonsbook.chap7.academy.Academy" />  
  35.          <set-properties-rule />  
  36.          <pattern value="student">  
  37.              <object-create-rule classname="com.commonsbook.chap7.academy.Student" />  
  38.              <set-properties-rule />  
  39.       
  40.              <pattern value="course">  
  41.                  <object-create-rule classname="com.commonsbook.chap7.academy.Course" />  
  42.                  <bean-property-setter-rule pattern="id"/>  
  43.                  <bean-property-setter-rule pattern="name"/>  
  44.                  <set-next-rule methodname="addCourse" />  
  45.              </pattern>  
  46.              <set-next-rule methodname="addStudent" />  
  47.          </pattern>  
  48.       
  49.          <pattern value="teacher">  
  50.              <object-create-rule classname="com.commonsbook.chap7.academy.Teacher" />  
  51.              <set-properties-rule />  
  52.              <call-method-rule pattern="certification" methodname="addCertification"  
  53.                  paramcount="1" />  
  54.              <call-param-rule pattern="certification" paramnumber="0"/>  
  55.              <set-next-rule methodname="addTeacher" />  
  56.          </pattern>  
  57.      </pattern>  
  58.     </digester-rules>  
复制代码
2. DigestXMLJavaAcademy.java

Java代码
  1. 1.public class DigestXMLJavaAcademy {     
  2. 2.    public void digest(){     
  3. 3.        try {     
  4. 4.            //Create Digester using rules defined in academyRules.xml     
  5. 5.            Digester digester = DigesterLoader.createDigester(     
  6. 6.                     this.getClass().getClassLoader().getResource("academyRules.xml"));     
  7. 7.     
  8. 8.            //Parse academy.xml using the Digester to get an instance of Academy     
  9. 9.            Academy a = (Academy)digester.parse(     
  10. 10.            this.getClass().getClassLoader().getResourceAsStream("academy.xml"));     
  11. 11.     
  12. 12.            Vector vStud=a.getStudents();     
  13. 13.            Vector vTeach=a.getTeachers();     
  14. 14.     
  15. 15.            for (int i = 0; i < vStud.size(); i++) {     
  16. 16.                System.out.println("Student>> "+PropertyUtils.describe(vStud.get(i)));     
  17. 17.            }     
  18. 18.     
  19. 19.            for (int i = 0; i < vTeach.size(); i++) {     
  20. 20.                System.out.println("Teacher>> "+ PropertyUtils.describe(vTeach.get(i)));     
  21. 21.            }     
  22. 22.         } catch(Exception e) {     
  23. 23.             e.printStackTrace();     
  24. 24.         }     
  25. 25.    }     
  26. 26.     
  27. 27.    public static void main(String[] args) {     
  28. 28.        DigestXMLJavaAcademy xmlDigest= new DigestXMLJavaAcademy();     
  29. 29.        xmlDigest.digest();     
  30. 30.    }     
  31. 31.}   
复制代码

论坛徽章:
0
发表于 2012-03-19 17:09 |显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP