1 / 31

第 15 章 SAX 程式設計

第 15 章 SAX 程式設計. 簡介 SAX - 什麼是 SAX. SAX 的英文全名為 Simple API for XML ,是一組簡單的應用程式介面( API ),將運用事件回呼機制,執行 XML 文件的剖析。 SAX 目前的版本為 2.0 ,也是本章介紹 SAX 所依循的版本。 有關 SAX 運作的機制,請參考下一節( 15-1-2 節),至於 SAX 的最新資訊,則請您到 http://www.saxproject.org/ 看看。

Download Presentation

第 15 章 SAX 程式設計

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第 15 章 SAX程式設計

  2. 簡介SAX - 什麼是SAX • SAX的英文全名為Simple API for XML,是一組簡單的應用程式介面(API),將運用事件回呼機制,執行XML文件的剖析。 • SAX目前的版本為2.0,也是本章介紹SAX所依循的版本。 • 有關SAX運作的機制,請參考下一節(15-1-2節),至於SAX的最新資訊,則請您到http://www.saxproject.org/看看。 • 至於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敘述完成類別的引用。

More Related