digester組件簡化了xml文件處理操作,能將xml文件按照事先確定的規(guī)則(采用編碼形式或xml配置文件形式),,映射成java對象,。
digester組件現(xiàn)在最新版本是2.0,它所依賴的組件是:commons-logging(推薦1.1版本),BeanUtils(推薦1.8版
本),,還有需要jdk1.5.
基本概念 1. 在Digester的內(nèi)部采用SAX來解析XML文件。為了能夠正確的使用它,必須在解析之前進行相應(yīng)的設(shè)置,。同時,,在解析xml文件的過程中,它使用Stack來保存和檢索這個期間產(chǎn)生的對象. 2. 為了簡化使用,,它通過匹配模式來定位要解析的xml標(biāo)簽,。匹配模式的例子如下: <?xml version="1.0"?> <students> <student> <name>Tom</name> <course>JSP</course> </student> <student> <name>Mary</name> <course>J2EE</course> </student> </students> 每個標(biāo)簽與相應(yīng)的匹配模式對應(yīng)如下表: 標(biāo)簽 匹配模式 <students> students <student> students/student <name> students/student/name <course> students/student/course 3.
使用匹配模式可以很方便的定位需要處理的元素,為了處理這些元素,,需要定義處理規(guī)則,。規(guī)則在匹配模式被找到時起作用。所有的規(guī)則都是從
org.apache.commons.digester.Rule派生的,。所有已定義的Rule對象,,可以在
org.apache.commons.digester中找到。 常用的規(guī)則: - ObjectCreate,,創(chuàng)建對象實例,。 - SetProperties,將標(biāo)簽屬性(Attribute)與要創(chuàng)建的對象的屬性相關(guān)聯(lián),。 - BeanPropertySetter,,將標(biāo)簽所包含標(biāo)簽與要創(chuàng)建的對象的屬性相關(guān)聯(lián)。 - SetNext,,設(shè)置遇到下一個標(biāo)簽時的動作,。 - CallMethod,設(shè)置當(dāng)匹配模式被找到時要調(diào)用的方法,。 - CallParam,,設(shè)置對應(yīng)的callMethod中指定方法所需要的參數(shù)值。
基本使用 以正確的順序調(diào)用Digester方法是成功使用Digester處理XML文件的關(guān)鍵,。使用步驟如下: 1. 創(chuàng)建org.apache.commons.digester.Digester實例并配置,,包括設(shè)置實現(xiàn)Digester Rule的對象。 2.
使用Digester的push方法在Digester使用的stack中放置一個初始對象,。在解析xml文件的過程中,,Digester使用stack
來保存它所找到的對象。第一個對象在遇到第一個標(biāo)簽時被放置到stack中,,當(dāng)最后一個標(biāo)簽處理完畢時被彈出,。為了最后能檢索到這個對象,因此需要一個初
始對象來保留一個指向它的引用,。 3. 注冊匹配模式和rule,。 4. 調(diào)用parse來解析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.硬編碼形式實現(xiàn) Student類 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; } } 處理類
- package com.tongda.whl.digester;
- import org.apache.commons.digester.*;
- import org.apache.commons.logging.*;
- import java.io.IOException;
- import java.util.Vector;
- import org.apache.commons.digester.xmlrules.*;
- import org.xml.sax.SAXException;
- public class DigestTest {
- private Log log=LogFactory.getLog(this.getClass());
- private Vector students;
- public DigestTest(){
- students= new Vector(5);
- }
- public void addStudent( Student student){
- students.add( student);
- }
- public String toString(){
- return ((Student)students.get(0)).getName();
- }
- public void digest(){
-
-
- Digester digester= new Digester();
-
- digester.push( this);
-
- digester.addObjectCreate( "students/student", Student.class);
-
-
- digester.addBeanPropertySetter( "students/student/name");
- digester.addBeanPropertySetter( "students/student/course");
-
- digester.addSetNext( "students/student", "addStudent");
- try {
-
- DigestTest ds= (DigestTest)digester.parse( getClass().getClassLoader().getResourceAsStream( "students.xml"));
- log.info(ds);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static void main(String args[]){
- DigestTest test=new DigestTest();
- test.digest();
- }
- }
結(jié)果顯示:Tom 3.配置文件方式實現(xiàn) 配置文件: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類 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類 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(); } } 處理類
- package com.tongda.whl.digester;
- import org.apache.commons.digester.*;
- import org.apache.commons.logging.*;
- import java.io.IOException;
- import java.util.Vector;
- import org.apache.commons.digester.xmlrules.*;
- import org.xml.sax.SAXException;
- public class DigestTest {
- private Log log=LogFactory.getLog(this.getClass());
- public void digestByConfig(){
- Digester digester = DigesterLoader.createDigester(this.getClass().getClassLoader().getResource("studentsRule.xml"));
- try {
- Students a= (Students)digester.parse( this.getClass().getClassLoader().getResourceAsStream("students.xml"));
- System.out.println(a);
- log.info(a);
- } catch (IOException e) {
- e.printStackTrace();
- } catch (SAXException e) {
- e.printStackTrace();
- }
- }
- public static void main(String args[]){
- DigestTest test=new DigestTest();
- test.digestByConfig();
- }
- }
結(jié)果顯示:Tom
在使用Digester需要注意的地方: 1- 調(diào)用順序,,正確的調(diào)用順序才能得出正確的結(jié)果。方法調(diào)用順序基本和標(biāo)簽在xml文件中的層次關(guān)系相對應(yīng),?;镜捻樞蚴牵合葎?chuàng)建對象,;然后設(shè)置屬性;隨后處理子元素,;最后設(shè)置遇到下一個元素所對應(yīng)的動作,。對于子元素的處理,是同樣的過程,。 2- 正確的使用初始對象,。對比上面2個例子,之所以在第一個例子中顯示的調(diào)用了digester的push方法,,其原因就在于我們并沒有如第二個例子一樣用xml的root元素創(chuàng)建一個實例,。如果不顯式的調(diào)用,我們將會丟失這個元素的引用,,那么也就無法得到后續(xù)的對象,。 3-
digester的addSetNex方法中所指定的方法實際上是包含匹配模式對應(yīng)標(biāo)簽的父標(biāo)簽對應(yīng)對象的方法。在上兩個例子中addStudent,,都
是包含Student對象的那個對象的方法,。對于第一個例子,是DigesterTest,;對于第二個例子,,是Students。而且它的位置通常是在創(chuàng)
建對象語句組的最后,,與addObjectCreate相對應(yīng),。在這2個語句之間的代碼中所指定的方法都是所創(chuàng)建對象的方法,。而且它們的順序與匹配模式所
對應(yīng)的標(biāo)簽的順序必須是一致的,。 4- 使用配置文件來創(chuàng)建digester,這樣會帶來很大的靈活性,。
|