digester組件簡(jiǎn)化了xml文件處理操作,能將xml文件按照事先確定的規則(采用編碼形式或xml配置文件形式),映射成java對象。digester組件現在最新版本是2.0,它所依賴(lài)的組件是:commons-logging(推薦1.1版本),BeanUtils(推薦1.8版本),還有需要jdk1.5.
基本概念
1. 在Digester的內部采用SAX來(lái)解析XML文件。為了能夠正確的使用它,必須在解析之前進(jìn)行相應的設置。同時(shí),在解析xml文件的過(guò)程中,它使用Stack來(lái)保存和檢索這個(gè)期間產(chǎn)生的對象.
2. 為了簡(jiǎn)化使用,它通過(guò)匹配模式來(lái)定位要解析的xml標簽。匹配模式的例子如下:
<?xml version="1.0"?>
<students>
<student>
<name>Tom</name>
<course>JSP</course>
</student>
<student>
<name>Mary</name>
<course>J2EE</course>
</student>
</students>
每個(gè)標簽與相應的匹配模式對應如下表:
標簽 匹配模式
<students> students
<student> students/student
<name> students/student/name
<course> students/student/course
3.使用匹配模式可以很方便的定位需要處理的元素,為了處理這些元素,需要定義處理規則。規則在匹配模式被找到時(shí)起作用。所有的規則都是從org.apache.commons.digester.Rule派生的。所有已定義的Rule對象,可以在org.apache.commons.digester中找到。
常用的規則:
- ObjectCreate,創(chuàng )建對象實(shí)例。
- SetProperties,將標簽屬性(Attribute)與要創(chuàng )建的對象的屬性相關(guān)聯(lián)。
- BeanPropertySetter,將標簽所包含標簽與要創(chuàng )建的對象的屬性相關(guān)聯(lián)。
- SetNext,設置遇到下一個(gè)標簽時(shí)的動(dòng)作。
- CallMethod,設置當匹配模式被找到時(shí)要調用的方法。
- CallParam,設置對應的callMethod中指定方法所需要的參數值。
基本使用
以正確的順序調用Digester方法是成功使用Digester處理XML文件的關(guān)鍵。使用步驟如下:
1. 創(chuàng )建org.apache.commons.digester.Digester實(shí)例并配置,包括設置實(shí)現Digester Rule的對象。
2.使用Digester的push方法在Digester使用的stack中放置一個(gè)初始對象。在解析xml文件的過(guò)程中,Digester使用stack來(lái)保存它所找到的對象。第一個(gè)對象在遇到第一個(gè)標簽時(shí)被放置到stack中,當最后一個(gè)標簽處理完畢時(shí)被彈出。為了最后能檢索到這個(gè)對象,因此需要一個(gè)初始對象來(lái)保留一個(gè)指向它的引用。
3. 注冊匹配模式和rule。
4. 調用parse來(lái)解析xml文件。
使用舉例
1.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<name>Tom</name>
<course>JSP</course>
</student>
<student>
<name>Mary</name>
<course>J2EE</course>
</student>
</students>
2.硬編碼形式實(shí)現
Student類(lèi)
package com.tongda.whl.digester;
public class Student {
private String name;
private String course;
public void setName(String name){
this.name=name;
}
public void setCourse(String course){
this.course=course;
}
public String getName(){
return this.name;
}
public String getCourse(){
return this.course;
}
}
處理類(lèi)
結果顯示:Tom
3.配置文件方式實(shí)現
配置文件:studentsRule.xml
<?xml version="1.0"?>
<digester-rules>
<pattern value="students">
<object-create-rule classname="com.tongda.whl.digester.Students" />
<set-properties-rule />
<pattern value="student">
<object-create-rule classname="com.tongda.whl.digester.Student" />
<bean-property-setter-rule pattern="name"/>
<bean-property-setter-rule pattern="course"/>
<set-next-rule methodname="addStudent" />
</pattern>
</pattern>
</digester-rules>
Student類(lèi)
package com.tongda.whl.digester;
public class Student {
private String name;
private String course;
public void setName(String name){
this.name=name;
}
public void setCourse(String course){
this.course=course;
}
public String getName(){
return this.name;
}
public String getCourse(){
return this.course;
}
}
Students類(lèi)
package com.tongda.whl.digester;
import java.util.Vector;
public class Students {
private Vector students;
public Students(){
students= new Vector(5);
}
public void addStudent( Student student){
students.add( student);
}
public String toString(){
return ((Student)students.get(0)).getName();
}
}
處理類(lèi)
結果顯示:Tom
在使用Digester需要注意的地方:
1- 調用順序,正確的調用順序才能得出正確的結果。方法調用順序基本和標簽在xml文件中的層次關(guān)系相對應?;镜捻樞蚴牵合葎?chuàng )建對象;然后設置屬性;隨后處理子元素;最后設置遇到下一個(gè)元素所對應的動(dòng)作。對于子元素的處理,是同樣的過(guò)程。
2- 正確的使用初始對象。對比上面2個(gè)例子,之所以在第一個(gè)例子中顯示的調用了digester的push方法,其原因就在于我們并沒(méi)有如第二個(gè)例子一樣用xml的root元素創(chuàng )建一個(gè)實(shí)例。如果不顯式的調用,我們將會(huì )丟失這個(gè)元素的引用,那么也就無(wú)法得到后續的對象。
3-digester的addSetNex方法中所指定的方法實(shí)際上是包含匹配模式對應標簽的父標簽對應對象的方法。在上兩個(gè)例子中addStudent,都是包含Student對象的那個(gè)對象的方法。對于第一個(gè)例子,是DigesterTest;對于第二個(gè)例子,是Students。而且它的位置通常是在創(chuàng )建對象語(yǔ)句組的最后,與addObjectCreate相對應。在這2個(gè)語(yǔ)句之間的代碼中所指定的方法都是所創(chuàng )建對象的方法。而且它們的順序與匹配模式所對應的標簽的順序必須是一致的。
4- 使用配置文件來(lái)創(chuàng )建digester,這樣會(huì )帶來(lái)很大的靈活性。
聯(lián)系客服