Digester不是一个XML Parser,它只是对SAX更高层次上的一个封装使用Digester,将XML映射成javaBean. 我们无须了解SAX和DOM的解析过程,只要给Digester添加一些解析规则,就能对一个xml文件进行解析。Digester使用堆栈来保存xml节点(stack.push()方法),当该xml节点中嵌套的所有子节点解析完毕,该节点将被弹出(stack.pup()方法)。Digester最大的优点就是使用模式匹配来表示xml文件中节点之间的父子关系 。
代码如下:
students.xml
Java Boy JSP Java Girl EJB
Model类:Student.java
package demo.javabean;public class Student ...{ private String name; private String from; private String course; public String getName() ...{ return name; } public void setName(String name) ...{ this.name = name; } public String getFrom() ...{ return from; } public void setFrom(String from) ...{ this.from = from; } public String getCourse() ...{ return course; } public void setCourse(String course) ...{ this.course = course; }}
Model类:StuClass.java
package demo.javabean;import java.util.Vector;public class StuClass ...{ private String name; private Vector students = new Vector(); public String getName() ...{ return name; } public void setName(String name) ...{ this.name = name; } public Vector getStudents() ...{ return students; } public void setStudents(Vector students) ...{ this.students = students; } public void addStudent(Student student)...{ students.add(student); }}
测试类:DigestStudents.java
package demo;import java.util.Vector;import org.apache.commons.digester.Digester;import demo.javabean.StuClass;public class DigestStudents ...{ Vector stuClass; public DigestStudents() ...{ stuClass = new Vector(); } public static void main(String[] args) ...{ DigestStudents digestStudents = new DigestStudents(); digestStudents.digest(); } private void digest() ...{ try ...{ Digester digester = new Digester(); // Push the current object onto the stack digester.setValidating(false); // Creates a new instance of the Student class digester.addObjectCreate("stuClass", "demo.javabean.StuClass"); digester.addSetProperties("stuClass", "name", "name"); digester.addObjectCreate("stuClass/student", "demo.javabean.Student"); // Uses setName method of the Student instance // Uses tag name as the property name // addCallMethod与addBeanPropertySetter等价 // 参数 0代表一个参数,默认就是当前读的数据,最后一个参数0表示参数个数 digester.addCallMethod("stuClass/student/name", "setName", 0); digester.addSetProperties("stuClass/student/name", "from", "from"); // 加上一个属性名form // digester.addBeanPropertySetter( "stuClass/student/name"); // Uses setCourse method of the Student instance // Explicitly specify property name as 'course' digester.addBeanPropertySetter("stuClass/student/course"); // Move to next student,addStudent为其中的一个方法 digester.addSetNext("stuClass/student", "addStudent", "demo.javabean.Student"); StuClass ds = (StuClass) digester.parse(this.getClass() .getClassLoader().getResourceAsStream( "demo/students.xml")); // Print the contents of the Vector System.out.println("Students Vector " + ds.getName()); System.out.println("Students Vector " + ds.getStudents()); } catch (Exception ex) ...{ ex.printStackTrace(); } } // public void addStudent( Student stud ) { // //Add a new Student instance to the Vector // stuClass.add( stud ); // }}
每年的同一天和他庆祝生日,每年的情人节、圣诞节、除夕,