官網 http://commons.apache.org/proper/commons-digester/
依賴jar包
Digester 3.0 + Logging 1.1.1 + BeanUtils 1.8.3
Digester底層採用SAX解析XML文件
這個Digester 是很強大的,tomcat xml 解析就是他,strusts的也是他,
Digester 的實體必須屬性必須實現get,set方法,滿足bean的要求
digester 首先解析定義規則
xml的層次
classes
classes/student
classes/student/address
<?xml version="1.0" encoding="UTF-8" ?>
<classes name="四年級" description="超級牛逼">
<student name="張三" age="20">
<address streetName="武侯區" streetNumber="223"/>
</student>
<student name="李四" age="18">
<address streetName="青羊區" streetNumber="900"/>
</student>
</classes>
public class Classes {
private String name;
private String description;
private ArrayList<Student> students = new ArrayList();
public void addStudents(Student student) {
this.students.add(student);
}
@Override
public String toString() {
return "Classes{" +
"name='" + name + '\'' +
", description='" + description + '\'' +
", students=" + students +
'}';
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Student {
private String name;
private int age;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
public class Address {
private String streetName;
private String streetNumber;
public String getStreetName() {
return streetName;
}
public void setStreetName(String streetName) {
this.streetName = streetName;
}
public String getStreetNumber() {
return streetNumber;
}
public void setStreetNumber(String streetNumber) {
this.streetNumber = streetNumber;
}
@Override
public String toString() {
return "Address{" +
"streetName='" + streetName + '\'' +
", streetNumber='" + streetNumber + '\'' +
'}';
}
}
public class DigesterTest {
public static void main(String[] args) throws Exception {
URL resource = DigesterTest.class.getClassLoader().getResource("com/digester/classes.xml");
Digester digester = new Digester();
digester.addObjectCreate("classes",Classes.class);//創建一個Classes對象
digester.addSetProperties("classes");//把classes節點全把設置到實體上
digester.addObjectCreate("classes/student", Student.class);//創建一個Student對象
digester.addSetProperties("classes/student");//把student節點全把設置到實體上
digester.addSetNext("classes/student","addStudents");//把節點student,調用addStdents 添加到Classes 對象上
digester.addObjectCreate("classes/student/address", Address.class);
digester.addSetProperties("classes/student/address");
digester.addSetNext("classes/student/address","setAddress");
Classes classes = ((Classes) digester.parse(resource));
System.out.println(classes.toString());
}
}
Classes{name='四年級', description='超級牛逼', students=[Student{name='張三', age=20, address=Address{streetName='武侯區', streetNumber='223'}}, Student{name='李四', age=18, address=Address{streetName='青羊區', streetNumber='900'}}]}
public class DigesterTest {
public static void main(String[] args) throws Exception {
URL resource = DigesterTest.class.getClassLoader().getResource("com/digester/classes.xml");
Digester digester = new Digester();
digester.addRuleSet(new RuleSetBase() {
@Override
public void addRuleInstances(Digester digester) {
digester.addObjectCreate("classes",Classes.class);//創建一個Classes對象
digester.addSetProperties("classes");//把classes節點全把設置到實體上
digester.addObjectCreate("classes/student", Student.class);//創建一個Student對象
digester.addSetProperties("classes/student");//把student節點全把設置到實體上
digester.addSetNext("classes/student","addStudents");//把節點student,調用addStdents 添加到Classes 對象上
digester.addObjectCreate("classes/student/address", Address.class);
digester.addSetProperties("classes/student/address");
digester.addSetNext("classes/student/address","setAddress");
}
});
Classes classes = ((Classes) digester.parse(resource));
System.out.println(classes.toString());
}
}
public class DigesterTest {
public static void main(String[] args) throws Exception {
URL resource = DigesterTest.class.getClassLoader().getResource("com/digester/classes.xml");
Digester digester = new Digester();
digester.addRuleSet(new MyRuleSet());
Classes classes = ((Classes) digester.parse(resource));
System.out.println(classes.toString());
}
}
//迪特米原則,知道最少原則
public class MyRuleSet extends RuleSetBase {
@Override
public void addRuleInstances(Digester digester) {
digester.addObjectCreate("classes",Classes.class);//創建一個Classes對象
digester.addSetProperties("classes");//把classes節點全把設置到實體上
digester.addObjectCreate("classes/student", Student.class);//創建一個Student對象
digester.addSetProperties("classes/student");//把student節點全把設置到實體上
digester.addSetNext("classes/student","addStudents");//把節點student,調用addStdents 添加到Classes 對象上
digester.addObjectCreate("classes/student/address", Address.class);
digester.addSetProperties("classes/student/address");
digester.addSetNext("classes/student/address","setAddress");
}
}
Digester類用來將XML映射成Java類,簡化XML的處理
對象創建
1.addObjectCreate(String rule,Class class)
設置節點與Java對象的映射規則,rule指定節點的篩選規則,class設置映射對象。SAX解析時,遇到rule指定的節節點,會創建一個class實例放入堆棧中。
比如:addObjectCreate(“classes”,Classes.class) 解析遇到classes節點時,會創建一個Classes實例並放入堆棧中。
屬性設置
2.addSetProperties(String rule)
設置節點的屬性設置規則。當解析遇到符合rule的節點時,根據屬性列表中的屬性值對,使用Java反射機制使用標準的JavaBean方法設置棧頂對象實例;
比如:digester.addSetProperties(“classes”),解析遇到user節點時,會獲取鍵值對 <classes name="四年級" description="超級牛逼">
獲得棧頂的Classes對象,設置實例的name、description屬性;
3.addBeanPropertySetter(String rule)
該方法的作用及使用方法類似於addSetProperties,只不過它是用rule所指定的標籤來調用對象的setter。
父子關係管理
4.addSetNext(String rule,String methodName)
設置當前rule節點與父節點的調用規則,當遇到rule節點時,調用堆棧中的次棧頂元素調用methodName方法。將棧頂元素作爲次頂元素指定方法的輸入參數。
5.addCallMethod(String rule,String methodName,int paraNumber)
該方法同樣設置對象的屬性,但更加靈活,不需要對象具有setter
根據rule規則指定的屬性,調用對象的methodName方法,paraNumber參數是表示方法需要的參數個數,當paraNumber=0時,可以單獨使用,不然需要配合addCallParam方法
6.addCallParam(String rule,int paraIndex,String attributeName)
該方法與addCallMethod配合使用,根據rule指定的標籤屬性來調用方法
paraIndex表明需要填充的方法形參序號,從0開始,方法由addCallMethdo指定,attributeName指定標籤屬性名;
7。 addRuleSet(RuleSet ruleSet),添加規則集合
這個Digester,還有很多功能和方法,需要深入瞭解請到官網上面查詢api