Posted on 2006-07-18 12:20
Earth 閱讀(342)
評論(0) 編輯 收藏 所屬分類:
Java
這里是在Eclipse下的展開圖:
?
下載源代碼
download
今天初學了一下Digester,并把它在Eclipse下跑了一遍,呵呵。學會開始用ant來構建任務了。發現如同JBuilder一樣也可以直接在TestDigester上使用Alt+Shift+X來運行main函數,不錯。
網上的例子只有一個大致的皮毛,我把這個foo ,bar的例子實際實現了一遍(后來發現Digester src包中給我們提供了幾個更好的例子,不錯)。使用Digester的步驟大致如下:
????????
//
首先要new一個Digester對象
????????Digester?digester?
=
?
new
?Digester();
????????
????????
//
?不進行XML與相應的DTD的合法性驗證
????????digester.setValidating(
false
);
????????
????????
//
?當遇到<foo>時創建一個test.Foo對象,并將其放在棧頂
????????digester.addObjectCreate(
"
foo
"
,?
"
test.Foo
"
);
????????
????????
//
?根據<foo>元素的屬性(這里是name),對剛創建的Foo對象的屬性(這里也是name)進行設置
????????
//
?注:xml中的屬性稱為attribute,對象中的屬性稱為property
????????digester.addSetProperties(
"
foo
"
);

????????
//
當遇到<foo>的子元素<bar>時創建一個test.Bar對象,并將其放在棧頂。
????????digester.addObjectCreate(
"
foo/bar
"
,?
"
test.Bar
"
);
????????
????????
//
根據<bar>元素的屬性,對剛創建的Bar對象的屬性進行設置,這里有兩個:分別是id和title
????????digester.addSetProperties(
"
foo/bar
"
);
????????
????????
//
當再次遇到<foo>的子元素<bar>時創建一個test.Bar對象,并將其放在棧頂,同時調用第二棧頂元素(Foo對象)的addBar方法。?
????????digester.addSetNext(
"
foo/bar
"
,?
"
addBar
"
,?
"
test.Bar
"
);

????????ClassLoader?classLoader?
=
?Thread.currentThread()
????????????????.getContextClassLoader();
????????InputStream?in?
=
?classLoader.getResourceAsStream(
"
Foobar.xml
"
);
????????Foo?foo?
=
?
null
;

????????
try
?
{

????????????
if
?(in?
!=
?
null
)?
{
????????????????foo?
=
?(Foo)?digester.parse(in);
//
分析結束后,返回根元素。
????????????}
????????}
?
catch
?(IOException?e)?
{
????????????e.printStackTrace();

????????}
?
catch
?(SAXException?e)?
{
????????????e.printStackTrace();
????????}
元素匹配模式
Digester能自動遍歷目標XML文檔的元素形成的層次結構,這個過程無須程序員參與。程序員的任務是,決定在解析的過程中,當由嵌套的元素形成的一個特定序列被識別出時如何進行處理。用以描述這種序列的機制,這就叫元素匹配模式。
當檢索的元素序列滿足某個匹配模式時,與該模式相對應的行為就會被自動執行。
對于元素模式,具體來說,就是元素和子元素間,通過“/”分隔并連接在一起,對于根元素之前則無需使用“/”。例如:
<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>都可匹配(不包括根元素級的).
處理規則
元素匹配模式用于確定什么時候進行處理,而處理規則則用于定義處理的內容,也就是進行什么樣的行動。
Digester定義了一系列的常用的處理規則。在設置Digester時,可能通過調用addRule()方法來注冊一個特定的元素匹配模式以及一個相應的處理規則類的實例。
用戶也可以自定義一些自己的處理規則類,用于滿足不同類型的特殊需求。定義一個處理規則首先要擴展org.apache.commons.digester.Rule類。然后再根據特殊的要求來實現begin(), body(), end(), finish()事件處理方法。
對于一些標準的規則類,可以創建它們的實例,并調用digester.addRule來注冊它們。由于經常使用它們,所以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打印出的信息可以窺見它所用到的處理規則
? 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])