digester.register("-//Apache Software Foundation//DTD Struts Configuration 1.0//EN",url.toString());
規則集打包
通常情況下,一個規則被創建后,接著便注冊,然后等在event時被調用,這些規則集很難為其它應用程序直接復用。一個解決方法是將所有規則都放在一個類中,此由這些規則可以很簡單地被裝載然后被注冊使用。RuleSet接口就是為些而設計,一般是通過擴展RuleSetBase類來開發規則集類。如例:
public class MyRuleSet extends RuleSetBase {
public MyRuleSet() {
this("");
}
public MyRuleSet(String prefix) {
super();
this.prefix = prefix;
this.namespaceURI = "http://www.mycompany.com/MyNamespace";
}
protected String prefix = null;
public void addRuleInstances(Digester digester) {
digester.addObjectCreate(prefix + "foo/bar",
"com.mycompany.MyFoo");
digester.addSetProperties(prefix + "foo/bar");
}
}
可以這樣使用這個規則集
Digester digester = new Digester();
... 一些配置Digester ...
digester.addRuleSet(new MyRuleSet("baz/"));
帶命名空間的XML解析
這種情況下,使用Digester的步驟為:
- 在Digester初始化部分,指明要考慮命名空間。
digester.setNamespaceAware(true);
- 指明一些規則的命名空間,如
digester.setRuleNamespaceURI("http://www.mycompany.com/MyNamespace");
- 接下來定義一些與此命名空間有關的規則,此時可以省卻前綴,如
digester.addObjectCreate("foo/bar", "com.mycompany.MyFoo");
digester.addSetProperties("foo/bar");
- 對其它命名空間,重復前面的2步
另外,在指明要digester考慮命名空間之后,在定義匹配模板時,可以將命名空間別名加“:”作為元素名稱的一部分使用。這與無命名空間時是一致的。
開發定制的匹配處理過程
通過實現 org.apache.commons.digester.Rules接口或擴展org.apache.commons.digester.RulesBase類來達到定制匹配過程的目的。
Digester提供ExtendedBaseRules來擴展了匹配模板的定義,引入了特殊通配字符?和*以及!,提供RegexRules來支持以正則式的語法定義匹配模板,提供WithDefaultsRulesWrapper來支持默認規則(即其它規則都不匹配時的處理規則)。
一些認識
通過看說明材料,尤其在學習Digester包中的Catalog例子以后,有一些認識:
1、由于xml對屬性名字的定義要求,與Java中對方法名字的定義要求不一致,導致出現不能自動映射的情況,如year-made標簽屬性,就不可能有方法setYear-made;
2、對于根元素,與其子元素建立聯系,有幾種辦法:一種是先生成根元素實例,壓入棧,然后解析,將調用方法規則建立聯系;另一種是解析的過程中第一個創建它,然后用getRoot的方法得到。
3、如果某對象類構造都要參數,則此時需要擴展AbstractObjectCreationFactory類為這種對象建立一個Factory,在這個Factory中取得初始化參數值然后再創建一個對象實例。
4、設有某個標簽,要想自動用該標簽子元素的內容填充該標簽對應的對象的屬性,則需要用digester.setRules(new ExtendedBaseRules()),然后addRules(),然后再調用addBeanPropertySetter("bala/lala/?");進行規則定義,注意此模板中有通配符。
5、如果對象的屬性是整型,則Digester自動將xml文件中字符串值轉換為整型。
6、在指明要digester考慮命名空間之后,如果不會引起歧義,完全可以忽略命名空間的存在,除非你要針對特定的命名空間進行特定的處理。