commons-digester

官網 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

發佈了43 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章