測試(演示使用方法):
測試用例
package
?com.ddm.readbook;

import
?org.apache.commons.digester.
*
;
import
?java.util.Iterator;


public
?
class
?TestCase?
{


????
public
?
static
?
void
?main(String[]?args)?
{
????????
//
建立一個Digester對象
????????Digester?digester?
=
?
new
?Digester();
????????
//
從reader標簽開始解析,并新建一個Reader對象做為根對象
????????digester.addObjectCreate(
"
reader
"
,Reader.
class
);
????????
//
根據reader標簽屬性值配置對象的屬性,此類的屬性必須具有setter
????????digester.addSetProperties(
"
reader
"
);
????????
????????
//
-----第1層元素開始
????????digester.addObjectCreate(
"
reader/book
"
,Book.
class
);
????????
//
digester.addSetProperties("reader/book");
????????
//
可以用以下三條語句代替
????????digester.addCallMethod(
"
reader/book
"
,
"
setInfo
"
,
2
);
????????digester.addCallParam(
"
reader/book
"
,
0
,
"
title
"
);
????????digester.addCallParam(
"
reader/book
"
,
1
,
"
author
"
);
????????
????????
//
-----第2層元素開始
????????digester.addObjectCreate(
"
reader/book/chapter
"
,Chapter.
class
);
????????digester.addBeanPropertySetter(
"
reader/book/chapter/no
"
);
????????
//
digester.addBeanPropertySetter("reader/book/chapter/caption");
????????
//
同樣可以替代
????????digester.addCallMethod(
"
reader/book/chapter/caption
"
,
"
setCaption
"
,
0
);
????????
????????digester.addSetNext(
"
reader/book/chapter
"
,
"
addReadedChapter
"
);
????????
//
-----第2層元素結束
????????
????????digester.addSetNext(
"
reader/book
"
,
"
addBook
"
);
????????
//
-----第1層元素結束
????????

????????
try
{
????????????
//
解析XML文件,并得到ROOT元素
????????????Reader?reader?
=
?(Reader)digester.parse(?TestCase.
class
.getClassLoader().getResourceAsStream(
"
readbook.xml
"
));
????????????
//
可以使用的替代方法1
????????????
//
reader?=?(Reader)digester.getRoot();
????????????
//
可以使用的方法2
????????????
//
先新建一個Reader對象,再對digester.push(reader);
????????????
????????????System.out.println(
"
姓名:
"
?
+
?reader.getName());
????????????System.out.println(
"
共讀書:
"
?
+
?reader.getBooks().size()?
+
?
"
本
"
);
????????????System.out.println(
"
*****************************
"
);
????????????
????????????Iterator?books?
=
?reader.getBooks().iterator(),chapters?
=
?
null
;
????????????Book?book?
=
?
null
;
????????????Chapter?chapter?
=
?
null
;

????????????
while
(books.hasNext())
{
????????????????
//
顯示書的信息
????????????????book?
=
?(Book)books.next();
????????????????System.out.println(
"
書名:
"
?
+
?book.getTitle()?
+
?
"
???????作者:
"
?
+
?book.getAuthor());
????????????????System.out.println(
"
------------------------------
"
);
????????????????
????????????????
//
顯示已閱讀章節
????????????????System.out.println(
"
共讀
"
?
+
?book.getReadedChapters().size()?
+
?
"
章
"
);
????????????????chapters?
=
?book.getReadedChapters().iterator();

????????????????
while
(chapters.hasNext())
{
????????????????????chapter?
=
?(Chapter)chapters.next();
????????????????????System.out.println(
"
第
"
?
+
?chapter.getNo()?
+
?
"
章????
"
?
+
?chapter.getCaption());
????????????????}
????????????????System.out.println(
"
------------------------------
"
);
????????????}
????????}
catch
(Exception?e)
{
????????????e.printStackTrace();
????????}
????}
}
運行效果:
???姓名:大大毛
???共讀書:2本
???*****************************
???書名:精通Struts?????? 作者:孫衛琴
???------------------------------
???共讀3章
???第1章??? Struts與Java Web應用簡介
???第2章??? Struts應用:helloapp應用
???第3章??? Struts應用的需求分析與設計
???------------------------------
???書名:Hibernate開發指南?????? 作者:夏昕
???------------------------------
???共讀1章
???第1章??? Hibernate初識
???------------------------------
???從測試用例中可以看出,Digester不光解析了XML所含的數據并對照新建了對象,而且還復原了對象之間的關系(一個樹的結構)
Digester類常用方法:
addObjectCreate(String?rule,Class?
class
)
???該方法用于構造指定類的對象,
???構造時機:
發現String rule規則所指定的節點
addSetProperties(String?rule)
???該方法用于設置對象的屬性,
???設置方法:取String rule規則所指定標簽的屬性?一一對應 的調用對象的setter,注意對象屬性的名稱必須與XML中標簽屬性名稱一致,可一次設置多個屬性
???設置時機:發現String rule規則所指定的節點;
addBeanPropertySetter(String?rule)
???該方法的作用及使用方法類似于addSetProperties,只不過它是用String rule規則所指定標簽的值 來 調用對象的setter;
addCallMethod(String?rule,String?methodName,
int
?paraNumber)
???該方法同樣是設置對象的屬性,但是方式更加靈活,不需要對象具有setter
???設置方法:取String rule規則指定標簽的屬性? 來 調用對象的方法(String methodName參數即是需要調用的方法名),int paraNumber參數是表示方法需要的參數個數
???注意:當paraNumber = 0時,可以單獨使用(表明為標簽的值來調用),不然需要配合addCallParam方法
addCallParam(String?rule,
int
?paraIndex,String?attributeName)
???該方法與addCallMethod配合使用
???設置方法:取String rule規則指定標簽的屬性值來調用方法
???參數:
??????int paraIndex:表明需要填充的方法形參序號,從 0 開始,方法由addCallMethod指定
??????String attributeName:指定標簽屬性名稱
addSetNext(String?rule,String?methodName)
???該方法用于指定下一次出現該標簽時,調用父對象的方法名,與addObjectCreate方法相呼應(不一定會對應,除非是push了Root元素)
???流程:
??????1.新建當前層元素的對象,相當于一個addObjectCreate
??????2.用新建的對象作為參數去調用父對象的指定方法(方法名由String methodName指定)
???作用:
??????可以復原標簽所表現出來的層次關系
使用Digester所需要的包:
???1. commons-beanutils.jar
???2. commons-collections.jar
???3. commons-digester.jar
???4. commons-logging.jar
??如果安裝了Struts框架,那么這些包就都有了
使用注意事項:
???1.Digester類調用的順序,必須與XML數據文件絕對一致;
???2.Digester類依賴于JavaBean規范,類必須符合規范;
???3.XML文件中標簽/屬性的名稱必須與Bean中的一致(包括大小寫);