commons-digester-1.7.jar
1、功能簡述:解析xml文件;
2、環(huán)境配置:所需要用到的jar包÷
Digester的運(yùn)行依賴下列包:
一個(gè)遵循Jaxp(1.1版本及以后)的XML解析器 xerces.jar
Jakarta commons beanutils包 commons-beanutils.jar (1.5版本及以后)
Jakarta commons collections包 commons-collections-3.1.jar(2.1版本及以后)
Jakarta commons logging包 commons-logging-1.0.4.jar(1.0.2版本及以后)
一個(gè)簡單的例子
3、使用限制:無平臺(tái)限制(沒有測試過)
4、是否可進(jìn)行封裝:可以進(jìn)行封裝,但我沒試過
5、調(diào)用思路:
讀取配置文件時(shí)使用。
6、代碼示例:
本代碼囊括了xml的大多數(shù)基本情況包括屬性值(如:penson的id)單一節(jié)點(diǎn)值(如:name),混合節(jié)點(diǎn)值(如:email)
***********Example.xml**********
<address-book>
<person id="1" category="acquaintance" try="would be ignored">
<name>Gonzo</name>
<email type="business">gonzo@muppets.com</email>
<gender result="the whole tag would be ignored">male</gender>
</person>
<person id="2" category="rolemodel">
<name>Kermit</name>
<email type="business">kermit@muppets.com</email>
<email type="home">kermie@acme.com</email>
</person>
</address-book>**********Person.java************
import java.util.HashMap;
import java.util.Iterator;
public class Person {
private int id;
private String category;
private String name;
private HashMap emails = new HashMap();
//下面的兩個(gè)方法的名字中set以后的部分,與<person>的屬性名字對(duì)映。當(dāng)從xml文件中識(shí)別出<person>的屬性時(shí),如果有要求(即調(diào)用過addSetProperties方法),Digester會(huì)依據(jù)這種對(duì)映關(guān)系自動(dòng)調(diào)用相應(yīng)的方法。
public void setId(int id) {
this.id = id;
}
public void setCategory(String category) {
this.category = category;
}
//對(duì)name而言,因?yàn)槠渲祦碜?lt;name>標(biāo)簽的內(nèi)容而非屬性值,需要用addCallMethod指定識(shí)別<name>后的要調(diào)用此方法(想自動(dòng)調(diào)用也要可以,需要addBeanPropertySetter,參見第下一個(gè)例子)。
public void setName(String name) {
this.name = name;
}
//同name,此時(shí)還要一一指定addEmail的參數(shù)值的來源。
public void addEmail(String type, String address) {
emails.put(type, address);
}
public void print() {
System.out.println("Person #" + id);
System.out.println(" category=" + category);
System.out.println(" name=" + name);
for(Iterator i = emails.keySet().iterator(); i.hasNext(); ) {
String type = (String) i.next();
String address = (String) emails.get(type);
System.out.println(" email (type " + type + ") : " + address);
}
}
}
**********AddressBook.java***********
import java.util.LinkedList;
import java.util.Iterator;
public class AddressBook {
LinkedList people = new LinkedList();
public void addPerson(Person p) {
people.addLast(p);
}
public void print() {
System.out.println("Address book has " + people.size() + " entries");
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);
// 增加規(guī)則
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);
}
// 將解析出的地址數(shù)據(jù)打印出來
book.print();
}
private static void addRules(Digester d) {
// 當(dāng)遇到<person>時(shí),創(chuàng)建類Person的一個(gè)實(shí)例,并將其壓入棧頂
d.addObjectCreate("address-book/person", Person.class);
// 將<person>標(biāo)簽的屬性(attribute)與棧頂Person類對(duì)象的屬性(property)設(shè)置方法根據(jù)各自的名字進(jìn)行映射,(例如,將標(biāo)簽屬性id與屬性設(shè)置方法setId進(jìn)行映射,將標(biāo)簽屬性category與屬性設(shè)置方法setCategory進(jìn)行映射),然后將屬性的值作參數(shù)傳遞給執(zhí)行相應(yīng)的方法。
// 如果某標(biāo)簽屬性沒法通過名字找到相應(yīng)的屬性設(shè)置方法,則此標(biāo)簽屬性被忽略(如example.xml中第一個(gè)<person>的try屬性)。
d.addSetProperties("address-book/person");
// 調(diào)用第二棧頂對(duì)象(AddressBook實(shí)例)的addPerson方法,以棧對(duì)象(Person實(shí)例)的對(duì)象為參數(shù)
d.addSetNext("address-book/person", "addPerson");
// 當(dāng)遇到<person>的子元素<name>時(shí),調(diào)用棧頂對(duì)象(Person實(shí)例)的setName方法。
// 此處addCallMethod方法的第一參數(shù)是規(guī)則,第二個(gè)參數(shù)是方法的名字,第三個(gè)是參數(shù)的數(shù)量(為0時(shí),表示只有一個(gè)參數(shù),且參數(shù)的值是元素的內(nèi)容)
d.addCallMethod("address-book/person/name", "setName", 0);
// 當(dāng)遇到<person>的子元素<email>時(shí),調(diào)用棧頂對(duì)象(Person實(shí)例)的addEmail方法,addEmail方法有兩個(gè)參數(shù),取值分別來自<email>的屬性type的值和<email>本身的內(nèi)容。
// 此處addCallParam方法的第一參數(shù)是規(guī)則,第二個(gè)參數(shù)是指明被調(diào)用方法(addEmail)參數(shù)的序號(hào),第三個(gè)是參數(shù)為字符串時(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");
}
}
Address book has 2 entries
Person #1
category=acquaintance
name=Gonzo
email (type business) : gonzo@muppets.com
Person #2
category=rolemodel
name=Kermit
email (type business) : kermit@muppets.com
email (type home) : kermie@acme.com