Presentation is loading. Please wait.

Presentation is loading. Please wait.

第 15 章 SAX程式設計.

Similar presentations


Presentation on theme: "第 15 章 SAX程式設計."— Presentation transcript:

1 第 15 章 SAX程式設計

2 簡介SAX - 什麼是SAX SAX的英文全名為Simple API for XML,是一組簡單的應用程式介面(API),將運用事件回呼機制,執行XML文件的剖析。 SAX目前的版本為2.0,也是本章介紹SAX所依循的版本。 有關SAX運作的機制,請參考下一節(15-1-2節),至於SAX的最新資訊,則請您到 至於Java執行環境的建立請參考附錄E-1的說明,xerces剖析器的下載與安裝,則請參考14-1-2節的說明。

3 簡介SAX - SAX的運作機制 以SAX機制處理XML文件的程式裡,有兩個重要的主角: 剖析XML文件的SAX剖析器
處理XML文件的處理器(handler)

4 簡介SAX - 瞭解事件回呼機制 範例的運作機制,如下述: STEP 1、完成BitcParse物件的建立
STEP 2、建立實做SAXHandler介面的myHandler處理器物件 STEP 3、將myHandler物件設定給BitcParse物件 STEP 4、執行剖析 STEP 5、 BitcParse物件透過SAXHandler介面,呼叫myHandler物件的方法

5 簡介SAX - 瞭解事件回呼機制 整個過程表達如下圖。

6 簡介SAX - 瞭解事件回呼機制 觀察執行結果,將可以瞭解到整個回呼機制的執行過程,並請留意介面在以下兩個問題所扮演的角色:
剖析器模擬類別如何取得回應事件的處理器物件 剖析器類別如何回呼處理器物件的方法

7 SAX程式設計- Java的SAX程式設計
在Java中,運用SAX剖析器處理XML文件的步驟如下所述: STEP 1、建立SAX剖析器物件 STEP 2、建立實做org.xml.sax套件內介面的處理器類別。 STEP 3、將處理器物件設定給SAX剖析器物件 STEP 4、將欲剖析的XML文件傳入SAX剖析器物件。 STEP 5、 SAX剖析器在處理XML文件的過程,將呼叫處理器物件回應剖析過程中所觸發事件的方法。

8 SAX程式設計- Java的SAX程式設計
整個過程表達如下圖。

9 SAX程式設計 - 運用SAX剖析器剖析XML文件
欲使用Apache Xerces的SAX剖析器時,需運用import指令引用,敘述如下: 由於剖析器物件將設定由類型為XMLReader介面的物件引用。因此,還必須引用org.xml.sax套件。 XMLReader介面為使用事件回呼機制,讀取XML文件的介面。接著,完成剖析器物件的建立。

10 SAX程式設計 - 運用SAX剖析器剖析XML文件
欲剖析XML文件時,則可呼叫parse()方法,並傳入欲剖析的檔案名稱。以下敘述將完成book.xml文件的剖析。

11 SAX程式設計 - 內容處理器的建立 定義內容處理器類別時,必須實做定義於org.xml.sax套件內的ContentHandler介面。因此,撰寫時,必須先完成套件與介面的引用。 由於ContentHandler介面內定義的事件回應方法,將丟出類型為SAXException的例外物件,因此,在程式內亦必須完成引用。

12 SAX程式設計 - 內容處理器的建立 欲將實做ContentHandler介面的自訂內容處理器物件,註冊給SAX剖析器時,必須呼叫XMLReader介面的setContentHandler,語法如下: XMLReader物件.setContentHandler( ContentHandler 內容處理器) 無回傳值。

13 SAX程式設計 - 內容處理器的建立 文件定位器的設定 設定文件定位器的方法為setDocumentLocator()方法,其介面如下: public void setDocumentLocator(Locator locator) setDocumentLocator()方法是剖析XML文件時,內容處理器第1個被呼叫的方法,用於設定Locator物件,其型別為org.xml.sax套件內的Locator介面。 在剖析XML文件的過程中,欲取得目前剖析的位置時,可以透過呼叫Locator物件之方法的方式得知。

14 SAX程式設計 - 內容處理器的建立 可供呼叫的方法說明如下表:

15 SAX程式設計 - 內容處理器的建立 文件剖析的開始與結束 當開始剖析XML文件時,SAX剖析器將呼叫startDocument()方法,介面如下: public void startDocument() throws SAXException 完成XML文件的剖析時,則將呼叫endDocument()方法,這個方法也是SAX剖析器剖析XML文件最後一個呼叫的方法,介面如下: public void endDocument() throws SAXException

16 SAX程式設計 - 內容處理器的建立 名稱空間 自SAX 2.0開始,增加了對名稱空間的支援,當開始處理名稱空間時,將呼叫startPrefixMapping()方法。 完成名稱空間的處理時,則將呼叫endPrefixMapping()方法。介面說明如下: public void startPrefixMapping( String prefix, String uri) throws SAXException public void endPrefixMapping( String prefix) throws SAXException

17 SAX程式設計 - 內容處理器的建立 處理指令 當剖析到XML文件內傳遞給應用程式的處理指令時,將呼叫processingInstructiong()方法,其介面如下: public void processingInstruction( String target, String data) throws SAXException

18 SAX程式設計 - 內容處理器的建立 元素 開始剖析XML文件內的元素時,SAX剖析器將呼叫startElement()方法。結束元素的剖析,則呼叫endElement。介面說明如下: public void startElement( String namespaceURI, String localName, String qName, Attributes atts) throws SAXException public void endElement (String namespaceURI, String localName, String qName) throws SAXException

19 SAX程式設計 - 內容處理器的建立 元素 開始剖析XML文件內的元素時,SAX剖析器將呼叫startElement()方法。結束元素的剖析,則呼叫endElement。介面說明如下: public void startElement( String namespaceURI, String localName, String qName, Attributes atts) throws SAXException public void endElement (String namespaceURI, String localName, String qName) throws SAXException

20 SAX程式設計 - 內容處理器的建立 欲取得屬性的個數時,可呼叫getLength()方法,語法如下: Attributes物件.getLength(); 回傳值型態為int。 欲取得屬性名稱時,可呼叫getLocalName()方法,語法如下: Attributes物件.getLocalName(int i); 回傳值型態為String。 欲取得屬性值時,可呼叫getValue()方法,語法如下: Attributes物件.getValue(int i); 回傳值型態為String。

21 SAX程式設計 - 內容處理器的建立 元素資料 處理元素資料時,將呼叫characters()方法,其介面如下: public void characters( char ch[], int start, int length) throws SAXException

22 SAX程式設計 - 內容處理器的建立 空白字元 剖析器遇到空白字元時,將呼叫characters()方法,其介面如下: public void ignorableWhitespace( char ch[], int start, int length) throws SAXException

23 SAX程式設計 - 內容處理器的建立 被忽略的實體 對於某些不需要驗證XML文件的剖析器,在剖析XML文件的過程中,可能略過實體宣告。因此,SAX 2.0提供了skippedEntity()方法,讓實體被略過時,透過此方法的呼叫,可取得略過實體的名稱。介面說明如下: public void skippedEntity(String name) throws SAXException

24 SAX程式設計 - 錯誤處理器的建立 對於XML文件錯誤的處理,則將交由實做ErrorHandler介面的錯誤處理器。
當錯誤處理器完成錯誤的處理後,SAX剖析器最後將呼叫內容處理器的endDocument()方法,結束XML文件的處理。 定義錯誤處理器類別時,必須實做定義於org.xml.sax套件內的ErrorHandler介面。因此,撰寫時,必須先完成該介面與套件的引用。

25 SAX程式設計 - 錯誤處理器的建立 由於SAX剖析器呼叫ErrorHandler介面內定義的事件回應方法,將傳入類型為SAXParseException的例外物件,因此,在程式內亦必須完成引用。 欲將實做ErrorHandler介面的自訂錯誤處理器物件註冊給SAX剖析器時,必須呼叫XMLReader介面的setErrorHandler,語法如下: XMLReader物件.setErrorHandler( ErrorHandler 錯誤處理器) 無回傳值。

26 SAX程式設計 - 錯誤處理器的建立 警告訊息 當SAX剖析器剖析XML文件時,發出警告訊息,將由ErrorHandler介面的warning()方法回應,其介面如下: public void warning( SAXParseException saxpe) 錯誤訊息 當SAX剖析器剖析XML文件時,發出錯誤訊息,將由ErrorHandler介面的error()方法回應,其介面如下: public void error(SAXParseException saxpe)

27 SAX程式設計 - 錯誤處理器的建立 嚴重錯誤訊息 當SAX剖析器剖析XML文件時,發出嚴重錯誤訊息(又稱不可回復的錯誤),將由ErrorHandler介面的fatalError()方法回應,其介面如下: public void fatalError(SAXParseException saxpe)

28 SAX程式設計 - 錯誤處理器的建立 透過SAXParseException物件取得錯誤訊息資料 當SAX剖析器發出錯誤訊息時,呼叫錯誤處理的各種方法時,均會傳入包含錯誤訊息的SAXParseException例外物件。

29 SAX程式設計 - 錯誤處理器的建立 下表為SAXParseException例外類別用於取得錯誤訊息的方法。

30 SAX程式設計 - 以繼承DefalutHandler類別建立的內容處理器
org.xml.sax套件提供DefaultHandler類別,讓程式設計師可透過繼承的方式,建立各種處理器。 在DefaultHandler類別內,已經完成SAX剖析器所需要的四種處理器介面所定義方法的實做。 程式設計師只要以繼承DefaultHandler類別的方式,建立自訂處理器類別,並僅需要針對想要處理的部份,透過重載(overriding)方法的機制,完成XML文件的處理。 當然那些自訂處理器類別沒有重載的方法,SAX剖析器呼叫時,便將由DefaultHandler類別定義的方法回應。

31 SAX程式設計 - 以繼承DefalutHandler類別建立的內容處理器
欲使用DefaultHandler類別時,必須運用import敘述完成類別的引用。


Download ppt "第 15 章 SAX程式設計."

Similar presentations


Ads by Google