為便于理解,將筆記的內容結構作了一些調整。
for(Iterator i = people.iterator(); i.hasNext(); ) {
Person p = (Person) i.next();
p.print();
}
}
}
************AddressBookDigester*********
import org.apache.commons.digester.Digester;
/**
* Usage: java Example1 example.xml
*/
public class AddressBookDigester {
public static void main(String[] args) {
if (args.length != 1) {
usage();
System.exit(-1);
}
String filename = args[0];
// 創(chuàng )建一個(gè)Digester實(shí)例
Digester d = new Digester();
// 創(chuàng )建AddressBook實(shí)例,并將其壓入棧頂。
AddressBook book = new AddressBook();
d.push(book);
// 增加規則
addRules(d);
// 處理輸入的xml文件
try {
java.io.File srcfile = new java.io.File(filename);
d.parse(srcfile);
}
catch(java.io.IOException ioe) {
System.out.println("Error reading input file:" + ioe.getMessage());
System.exit(-1);
}
catch(org.xml.sax.SAXException se) {
System.out.println("Error parsing input file:" + se.getMessage());
System.exit(-1);
}
// 將解析出的地址數據打印出來(lái)
book.print();
}
private static void addRules(Digester d) {
// 當遇到<person>時(shí),創(chuàng )建類(lèi)Person的一個(gè)實(shí)例,并將其壓入棧頂
d.addObjectCreate("address-book/person", Person.class);
// 將<person>標簽的屬性(attribute)與棧頂Person類(lèi)對象的屬性(property)設置方法根據各自的名字進(jìn)行映射,(例如,將標簽屬性id與屬性設置方法setId進(jìn)行映射,將標簽屬性category與屬性設置方法setCategory進(jìn)行映射),然后將屬性的值作參數傳遞給執行相應的方法。
// 如果某標簽屬性沒(méi)法通過(guò)名字找到相應的屬性設置方法,則此標簽屬性被忽略(如example.xml中第一個(gè)<person>的try屬性)。
d.addSetProperties("address-book/person");
// 調用第二棧頂對象(AddressBook實(shí)例)的addPerson方法,以棧對象(Person實(shí)例)的對象為參數
d.addSetNext("address-book/person", "addPerson");
// 當遇到<person>的子元素<name>時(shí),調用棧頂對象(Person實(shí)例)的setName方法。
// 此處addCallMethod方法的第一參數是規則,第二個(gè)參數是方法的名字,第三個(gè)是參數的數量(為0時(shí),表示只有一個(gè)參數,且參數的值是元素的內容)
d.addCallMethod("address-book/person/name", "setName", 0);
// 當遇到<person>的子元素<email>時(shí),調用棧頂對象(Person實(shí)例)的addEmail方法,addEmail方法有兩個(gè)參數,取值分別來(lái)自<email>的屬性type的值和<email>本身的內容。
// 此處addCallParam方法的第一參數是規則,第二個(gè)參數是指明被調用方法(addEmail)參數的序號,第三個(gè)是參數為字符串時(shí)指屬性的名字)
d.addCallMethod("address-book/person/email", "addEmail", 2);
d.addCallParam("address-book/person/email", 0, "type");
d.addCallParam("address-book/person/email", 1);
}
private static void usage() {
System.out.println("Usage: java Example1 example.xml");
}
}
聯(lián)系客服