這里是在Eclipse下的展開圖:?
下載源代碼download
今天初學了一下Digester,并把它在Eclipse下跑了一遍,呵呵。學會開始用ant來構建任務了。發(fā)現(xiàn)如同JBuilder一樣也可以直接在TestDigester上使用Alt+Shift+X來運行main函數(shù),不錯。
網(wǎng)上的例子只有一個大致的皮毛,我把這個foo ,bar的例子實際實現(xiàn)了一遍(后來發(fā)現(xiàn)Digester src包中給我們提供了幾個更好的例子,不錯)。使用Digester的步驟大致如下:











































元素匹配模式
Digester能自動遍歷目標XML文檔的元素形成的層次結構,這個過程無須程序員參與。程序員的任務是,決定在解析的過程中,當由嵌套的元素形成的一個特定序列被識別出時如何進行處理。用以描述這種序列的機制,這就叫元素匹配模式。
當檢索的元素序列滿足某個匹配模式時,與該模式相對應的行為就會被自動執(zhí)行。
對于元素模式,具體來說,就是元素和子元素間,通過“/”分隔并連接在一起,對于根元素之前則無需使用“/”。例如:
<a> -- 匹配模板 "a"
<b> -- 匹配模板 "a/b"
<c/> -- 匹配模板 "a/b/c"
<c/> -- 匹配模板 "a/b/c"
</b>
<b> -- 匹配模板 "a/b"
<c/> -- 匹配模板 "a/b/c"
<c/> -- 匹配模板 "a/b/c"
<c/> -- 匹配模板 "a/b/c"
</b>
</a>
字符”*”表示任意級別,如”*/a”表示任意級別的<a>都可匹配(不包括根元素級的).
處理規(guī)則
元素匹配模式用于確定什么時候進行處理,而處理規(guī)則則用于定義處理的內(nèi)容,也就是進行什么樣的行動。
Digester定義了一系列的常用的處理規(guī)則。在設置Digester時,可能通過調(diào)用addRule()方法來注冊一個特定的元素匹配模式以及一個相應的處理規(guī)則類的實例。
用戶也可以自定義一些自己的處理規(guī)則類,用于滿足不同類型的特殊需求。定義一個處理規(guī)則首先要擴展org.apache.commons.digester.Rule類。然后再根據(jù)特殊的要求來實現(xiàn)begin(), body(), end(), finish()事件處理方法。
對于一些標準的規(guī)則類,可以創(chuàng)建它們的實例,并調(diào)用digester.addRule來注冊它們。由于經(jīng)常使用它們,所以digester定義了一些簡便的方法來注冊它們。如:
Rule rule = new SetNextRule(digester, "addChild","com.mycompany.mypackage.MyChildClass");
digester.addRule("a/b/c", rule);
可以用下列代碼替換
digester.addSetNext("a/b/c", "addChild", "com.mycompany.mypackage.MyChildClass");
在前面的foo, bar例子中,從log4j打印出的信息可以窺見它所用到的處理規(guī)則
? New match='foo'
[ObjectCreateRule]{foo}New test.Foo
[SetPropertiesRule]{foo} Setting property 'name' to 'The Parent'
? New match='foo/bar'
[ObjectCreateRule]{foo/bar}New test.Bar
[SetPropertiesRule]{foo/bar} Setting property 'id' to '123'
[SetPropertiesRule]{foo/bar} Setting property 'title' to 'The First Child'
[SetNextRule]{foo/bar} Call test.Foo.addBar(test.Bar@30c221[id=123,title=The First Child])