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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章