Digester是Jakarta 子项目Commons下的一个模块,支持基于规则的对任意XML文档的处理。Jwebap中采用它进行XML的加载。
Digester项目提供了非常友好的XML操作API,当XML结构改变时,只需要改变映射的规则,就可以完成代码的修改。
Digester项目提供了一个简单的例子
假定有两个JavaBean如下,分别为Person和Address
package mypackage;
public class Person {
public void addAddress(Address address);
public Iterator getAddress();
public String getName();
public void setName(String name);
}
public mypackage;
public class Address {
public int getStreet();
public void setStreet(String street);
public String getCity();
public void setCity(String city);
}
用下面的xml文件进行配置
<Person name="yu.lide">
<address>
<type>business</type>
<street>234 Maple Dr.</street>
<city>Los Angeles</city>
<state>CA</state>
<zip>98765</zip>
<country>USA</country>
</address>
<address>
<type>business</type>
<street>234 Maple Dr.</street>
<city>Los Angeles</city>
<state>CA</state>
<zip>98765</zip>
<country>USA</country>
</address>
</Person>
Digester digester = new Digester();
digester.setValidating(false); //不进行XML与相应的DTD的合法性验证
//当遇到<Person>时创建一个mypackage.Person对象,并将其放在栈顶
digester.addObjectCreate("Person", "mypackage.Person");
//根据<Person>元素的属性(attribute),对刚创建的Person对象的属性(property)进行设置
digester.addSetProperties("Person");
//当遇到<Person>的子元素<address>时创建一个mypackage.Address对象,并将其放在栈顶。
digester.addObjectCreate("Person/Address", "mypackage.Address");
//根据<Address>元素的属性(attribute),对刚创建的Address对象的属性(property)进行设置
digester.addSetProperties("Person/Address");
//对<Address>元素的子标签包含的内容当成属性进行设置
digester.addSetNestProperties("Person/Address");
//当再次遇到<Person>的子元素<Address>时创建一个mypackage.Address对象,并将其放在栈顶,同时调用第二栈顶元素(Person对象)的addAddress方法。
digester.addSetNext("Person/Address", "addAddress", "mypackage.Address");
Person person = (Person) digester.parse();
当然,也可以通过配置rule.xml规则定义文件,来定义每个对象的映射规则,配置语法也很简单
<digester-rules>
<pattern value="address-book">
<pattern value="person">
<object-create-rule classname="Person"/>
<set-properties-rule/>
<set-next-rule methodname="addPerson"/>
<pattern value="name">
<call-method-rule methodname="setName" paramcount="0"/>
</pattern>
<pattern value="email">
<call-method-rule methodname="addEmail" paramcount="2"/>
<call-param-rule paramnumber='0' attrname='type'/>
<call-param-rule paramnumber='1'/>
</pattern>
<pattern value="address">
<object-create-rule classname="Address"/>
<set-nested-properties-rule/>
<set-next-rule methodname="addAddress"/>
</pattern>
</pattern>
</pattern>
</digester-rules>
是不是很好用?多的不说,赶快去下载一下,试试吧,非常简单