Digester學習筆記
程序中用到的文件Example.xml (程序解析的xml文件)
???????????????
??????????????????
?1?<?xml?version="1.0"?encoding="UTF-8"?>
?2?
?3?<address-book>
?4?????<person?id="1"?category="acquaintance"?try="would?be?ignored">
?5?
?6?????<name>Gonzo</name>
?7?
?8?????<email?type="business">gonzo@muppets.com</email>
?9?
10?????<gender?result="the?whole?tag?would?be?ignored">male</gender>
11?
12???</person>
13?
14???<person?id="2"?category="rolemodel">
15?
16?????<name>Kermit</name>
17?
18?????<email?type="business">kermit@muppets.com</email>
19?
20?????<email?type="home">kermie@acme.com</email>
21?
22???</person>
23?
24?</address-book>
?2?
?3?<address-book>
?4?????<person?id="1"?category="acquaintance"?try="would?be?ignored">
?5?
?6?????<name>Gonzo</name>
?7?
?8?????<email?type="business">gonzo@muppets.com</email>
?9?
10?????<gender?result="the?whole?tag?would?be?ignored">male</gender>
11?
12???</person>
13?
14???<person?id="2"?category="rolemodel">
15?
16?????<name>Kermit</name>
17?
18?????<email?type="business">kermit@muppets.com</email>
19?
20?????<email?type="home">kermie@acme.com</email>
21?
22???</person>
23?
24?</address-book>
Person.java :
????????????
?1?package?digester.test;
?2?
?3?import?java.util.HashMap;
?4?import?java.util.Iterator;
?5?
?6?public?class?Person?{
?7?????private?int?id;
?8?????private?String??category;
?9?????private?String?name;
10?????private?HashMap<String,?String>?emails?=?new?HashMap<String,?String>();
11?????//下面的兩個方法的名字中set以后的部分,與</person>的屬性名字對應?
12?????//當從xml文件中識別出<person>的屬性時,如果有要求(即調用過addSetProperties方法),Digester會依據這種對映關系自動調用相應的方法。
13?????
14?????public?void?setId(int?id){
15?????????this.id=id;????????
16?????}
17?????public?void?setCategory(String?category)?{
18???????????this.category?=?category;
19???????}
20?????
21?????//對應name而言,因為其值來自name標簽的內容,而非屬性值
22?????//需要調用addCallMethod指定識別<name>后調用此方法,自動調用,需調用addBeanPropertySetter()方法
23?????
24??????public?void?setName(String?name)?{
25???????????this.name?=?name;
26???????}
27??????//同name,此時還要一一指定addEmail的參數值的來源。
28??????public?void?addEmail(String?type,?String?address)?{
29???????????emails.put(type,?address);
30???????}
31??????public?void?print()?{
32?
33???????????System.out.println("Person?#"?+?id);
34?
35???????????System.out.println("category="?+?category);
36?
37???????????System.out.println("name="?+?name);
38?
39???????????for(Iterator?i?=?emails.keySet().iterator();?i.hasNext();?)?{
40?
41???????????????String?type?=?(String)?i.next();
42?
43???????????????String?address?=?(String)?emails.get(type);
44?
45???????????????System.out.println("??email?(type?"?+?type?+?")?:?"?+?address);
46?
47???????????}
48?
49???????}
50?
51?}
52?
?2?
?3?import?java.util.HashMap;
?4?import?java.util.Iterator;
?5?
?6?public?class?Person?{
?7?????private?int?id;
?8?????private?String??category;
?9?????private?String?name;
10?????private?HashMap<String,?String>?emails?=?new?HashMap<String,?String>();
11?????//下面的兩個方法的名字中set以后的部分,與</person>的屬性名字對應?
12?????//當從xml文件中識別出<person>的屬性時,如果有要求(即調用過addSetProperties方法),Digester會依據這種對映關系自動調用相應的方法。
13?????
14?????public?void?setId(int?id){
15?????????this.id=id;????????
16?????}
17?????public?void?setCategory(String?category)?{
18???????????this.category?=?category;
19???????}
20?????
21?????//對應name而言,因為其值來自name標簽的內容,而非屬性值
22?????//需要調用addCallMethod指定識別<name>后調用此方法,自動調用,需調用addBeanPropertySetter()方法
23?????
24??????public?void?setName(String?name)?{
25???????????this.name?=?name;
26???????}
27??????//同name,此時還要一一指定addEmail的參數值的來源。
28??????public?void?addEmail(String?type,?String?address)?{
29???????????emails.put(type,?address);
30???????}
31??????public?void?print()?{
32?
33???????????System.out.println("Person?#"?+?id);
34?
35???????????System.out.println("category="?+?category);
36?
37???????????System.out.println("name="?+?name);
38?
39???????????for(Iterator?i?=?emails.keySet().iterator();?i.hasNext();?)?{
40?
41???????????????String?type?=?(String)?i.next();
42?
43???????????????String?address?=?(String)?emails.get(type);
44?
45???????????????System.out.println("??email?(type?"?+?type?+?")?:?"?+?address);
46?
47???????????}
48?
49???????}
50?
51?}
52?
AddressBook.java
?????????
?1?package?digester.test;
?2?
?3?import?java.util.Iterator;
?4?import?java.util.LinkedList;
?5?
?6?public?class?AddressBook?{
?7??????LinkedList?people?=?new?LinkedList();
?8?
?9?????????public?void?addPerson(Person?p)?{
10?????????????people.addLast(p);
11?????????}
12?????????public?void?print()?{
13?????????????System.out.println("Address?book?has?"?+?people.size()?+?"?entries");?
14?????????????for(Iterator?i?=?people.iterator();?i.hasNext();?)?{
15?????????????????Person?p?=?(Person)?i.next();
16?????????????????p.print();
17?????????????}
18?
19?????????}
20?????????public?void?digest()?{
21?????????????//?TODO?Auto-generated?method?stub
22?????????????
23?????????}
24?
25?
26?}
27?
?2?
?3?import?java.util.Iterator;
?4?import?java.util.LinkedList;
?5?
?6?public?class?AddressBook?{
?7??????LinkedList?people?=?new?LinkedList();
?8?
?9?????????public?void?addPerson(Person?p)?{
10?????????????people.addLast(p);
11?????????}
12?????????public?void?print()?{
13?????????????System.out.println("Address?book?has?"?+?people.size()?+?"?entries");?
14?????????????for(Iterator?i?=?people.iterator();?i.hasNext();?)?{
15?????????????????Person?p?=?(Person)?i.next();
16?????????????????p.print();
17?????????????}
18?
19?????????}
20?????????public?void?digest()?{
21?????????????//?TODO?Auto-generated?method?stub
22?????????????
23?????????}
24?
25?
26?}
27?
主類:AddressBookDigester.java
???????????????
?1?package?digester.test;
?2?
?3?import?org.apache.commons.digester.Digester;
?4?????/**
?5??????*????digester技術最普通的應用,就是用來動態創建一個由java對象構成的樹結構,各對象的屬性以及對象間的關系。
?6??????*????是基于xml文檔的內容來設置的。為實現這種應用,Digester提供了一個對象棧
?7??????*????clear(),清空棧的內容;peek(),返回對棧頂對象的引用;pop(),將棧頂對象彈出并返回;push(),將一個新的對象壓入棧頂。
?8??????*??用棧的原因:
?9??????*??????????當識別一個xml元素的開始,創建對象并壓人棧頂。這個對象在處理該元素的子元素過程中一直在棧中,
10??????*??????????當所有子元素處理完后,解析器遇到該元素的結束標記,彈出此對象,并進行相應的處理。
11??????*?描述對象間的關系:
12??????*?????????????將棧頂對象作為一個參數,傳遞給該對象的下面的對象的一個方法,就可以簡單的建立父子關系。
13??????*?????????????從而可以簡單地建立起1:1的關系(第二棧頂對象與棧頂對象之間)和1:N的關系(第二棧頂對象不動,N次壓棧頂彈棧頂對象)
14??????*
15??????*/
16?public?class?AddressBookDigester?{
17?????public?static?void?main(String[]?args)?throws?Exception?{
18?????????AddressBookDigester?d=new?AddressBookDigester();
19?????????//?創建一個Digester實例
20?????????//當遇到匹配元素的開始標記和結束標記時,begin()方法和end()方法將分別被調用。?
21?????????Digester?digester=?new?Digester();
22?????????//?創建AddressBook實例,并將其壓入棧頂。
23?????????AddressBook?book?=?new?AddressBook();
24?????????digester.push(book);
25?????????//?增加規則
26?????????addRules(digester);
27?????????java.io.File?srcfile?=?new?java.io.File("../struts/src/Example.xml");
28?????????digester.parse(srcfile);
29?????????book.print();
30?????}
31?
32?????private?static?void?addRules(Digester?digester)?{
33?????????
34?????????//當遇到<person>時,創建類Person的一個實例,并將其壓入棧頂
35?????????//當元素被處理結束時,對象被彈出。
36?????????digester.addObjectCreate("address-book/person",?Person.class);
37?????????
38?????????//?將<person>標簽的屬性(attribute)與棧頂Person類對象的屬性(property)設置方法根據各自的名字進行映射,
39?????????//?(例如,將標簽屬性id與屬性設置方法setId進行映射,將標簽屬性category與屬性設置方法setCategory進行映射),
40?????????//?然后將屬性的值作參數傳遞給執行相應的方法。
41?
42?????????//?如果某標簽屬性沒法通過名字找到相應的屬性設置方法,則此標簽屬性被忽略(如example.xml中第一個<person>的try屬性)。
43?
44?????????digester.addSetProperties("address-book/person");
45?
46?????????//調用第二棧頂對象(AddressBook實例)的addPerson方法,以棧對象(Person實例)的對象為參數
47?????????//配置完畢的Bean插入父對象。?
48?????????
49?????????//彈出棧頂的對象,把它傳遞給緊接其下的另一個對象的指定名稱的方法。
50?????????//通常用來把一個已經初始化的Bean插入到父對象。?
51?
52?????????digester.addSetNext("address-book/person",?"addPerson");
53?
54?????????//?當遇到<person>的子元素<name>時,調用棧頂對象(Person實例)的setName方法。
55?
56?????????//?此處addCallMethod方法的第一參數是規則,第二個參數是方法的名字,
57?????????//?第三個是參數的數量(為0時,表示只有一個參數,且參數的值是元素的內容
58?????????
59?????????//調用頂層Bean的指定名稱的方法。
60?????????//被調用的方法可以有任意多個參數,參數的值通過后繼的CallParamRule給出。?
61?
62?????????digester.addCallMethod("address-book/person/name",?"setName",?0);
63?
64?????????//?當遇到<person>的子元素<email>時,調用棧頂對象(Person實例)的addEmail方法,
65?????????//?addEmail方法有兩個參數,取值分別來自<email>的屬性type的值和<email>本身的內容。
66?
67?????????//此處addCallParam方法的第一參數是規則,第二個參數是指明被調用方法(addEmail)參數的序號,第三個是參數為字符串時指屬性的名字)
68?????????//表示方法調用的參數。參數的值取自指定名稱的XML元素的屬性,或者是當前元素包含的原始字符數據。
69?????????//這個規則要求用一個整數指定它在參數列表中的位置。
70?????????
71?????????digester.addCallMethod("address-book/person/email",?"addEmail",?2);
72?????????digester.addCallParam("address-book/person/email",?0,?"type");
73?????????digester.addCallParam("address-book/person/email",?1);
74?????????
75?????}
76?
77?????
78?}
79?
?2?
?3?import?org.apache.commons.digester.Digester;
?4?????/**
?5??????*????digester技術最普通的應用,就是用來動態創建一個由java對象構成的樹結構,各對象的屬性以及對象間的關系。
?6??????*????是基于xml文檔的內容來設置的。為實現這種應用,Digester提供了一個對象棧
?7??????*????clear(),清空棧的內容;peek(),返回對棧頂對象的引用;pop(),將棧頂對象彈出并返回;push(),將一個新的對象壓入棧頂。
?8??????*??用棧的原因:
?9??????*??????????當識別一個xml元素的開始,創建對象并壓人棧頂。這個對象在處理該元素的子元素過程中一直在棧中,
10??????*??????????當所有子元素處理完后,解析器遇到該元素的結束標記,彈出此對象,并進行相應的處理。
11??????*?描述對象間的關系:
12??????*?????????????將棧頂對象作為一個參數,傳遞給該對象的下面的對象的一個方法,就可以簡單的建立父子關系。
13??????*?????????????從而可以簡單地建立起1:1的關系(第二棧頂對象與棧頂對象之間)和1:N的關系(第二棧頂對象不動,N次壓棧頂彈棧頂對象)
14??????*
15??????*/
16?public?class?AddressBookDigester?{
17?????public?static?void?main(String[]?args)?throws?Exception?{
18?????????AddressBookDigester?d=new?AddressBookDigester();
19?????????//?創建一個Digester實例
20?????????//當遇到匹配元素的開始標記和結束標記時,begin()方法和end()方法將分別被調用。?
21?????????Digester?digester=?new?Digester();
22?????????//?創建AddressBook實例,并將其壓入棧頂。
23?????????AddressBook?book?=?new?AddressBook();
24?????????digester.push(book);
25?????????//?增加規則
26?????????addRules(digester);
27?????????java.io.File?srcfile?=?new?java.io.File("../struts/src/Example.xml");
28?????????digester.parse(srcfile);
29?????????book.print();
30?????}
31?
32?????private?static?void?addRules(Digester?digester)?{
33?????????
34?????????//當遇到<person>時,創建類Person的一個實例,并將其壓入棧頂
35?????????//當元素被處理結束時,對象被彈出。
36?????????digester.addObjectCreate("address-book/person",?Person.class);
37?????????
38?????????//?將<person>標簽的屬性(attribute)與棧頂Person類對象的屬性(property)設置方法根據各自的名字進行映射,
39?????????//?(例如,將標簽屬性id與屬性設置方法setId進行映射,將標簽屬性category與屬性設置方法setCategory進行映射),
40?????????//?然后將屬性的值作參數傳遞給執行相應的方法。
41?
42?????????//?如果某標簽屬性沒法通過名字找到相應的屬性設置方法,則此標簽屬性被忽略(如example.xml中第一個<person>的try屬性)。
43?
44?????????digester.addSetProperties("address-book/person");
45?
46?????????//調用第二棧頂對象(AddressBook實例)的addPerson方法,以棧對象(Person實例)的對象為參數
47?????????//配置完畢的Bean插入父對象。?
48?????????
49?????????//彈出棧頂的對象,把它傳遞給緊接其下的另一個對象的指定名稱的方法。
50?????????//通常用來把一個已經初始化的Bean插入到父對象。?
51?
52?????????digester.addSetNext("address-book/person",?"addPerson");
53?
54?????????//?當遇到<person>的子元素<name>時,調用棧頂對象(Person實例)的setName方法。
55?
56?????????//?此處addCallMethod方法的第一參數是規則,第二個參數是方法的名字,
57?????????//?第三個是參數的數量(為0時,表示只有一個參數,且參數的值是元素的內容
58?????????
59?????????//調用頂層Bean的指定名稱的方法。
60?????????//被調用的方法可以有任意多個參數,參數的值通過后繼的CallParamRule給出。?
61?
62?????????digester.addCallMethod("address-book/person/name",?"setName",?0);
63?
64?????????//?當遇到<person>的子元素<email>時,調用棧頂對象(Person實例)的addEmail方法,
65?????????//?addEmail方法有兩個參數,取值分別來自<email>的屬性type的值和<email>本身的內容。
66?
67?????????//此處addCallParam方法的第一參數是規則,第二個參數是指明被調用方法(addEmail)參數的序號,第三個是參數為字符串時指屬性的名字)
68?????????//表示方法調用的參數。參數的值取自指定名稱的XML元素的屬性,或者是當前元素包含的原始字符數據。
69?????????//這個規則要求用一個整數指定它在參數列表中的位置。
70?????????
71?????????digester.addCallMethod("address-book/person/email",?"addEmail",?2);
72?????????digester.addCallParam("address-book/person/email",?0,?"type");
73?????????digester.addCallParam("address-book/person/email",?1);
74?????????
75?????}
76?
77?????
78?}
79?
???以上的程序來源網絡,我真理了一下。
附件:http://www.aygfsteel.com/Files/windfree/test.rar
# re: Digester學習筆記 2007-01-26 18:40 小竹 回復 更多評論
blog不錯...筆記很詳細...學習ing