第 15 章 sax 程式設計

31
15 15 SAX SAX 第第第第 第第第第

Upload: michael-beard

Post on 30-Dec-2015

50 views

Category:

Documents


1 download

DESCRIPTION

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

TRANSCRIPT

Page 1: 第  15  章  SAX 程式設計

第 第 15 15 章 章 SAXSAX 程式設計程式設計

Page 2: 第  15  章  SAX 程式設計

簡介簡介 SAX SAX - - 什麼是什麼是 SAXSAX

SAXSAX 的英文全名為的英文全名為 Simple API for XMLSimple API for XML ,是一組簡,是一組簡單的應用程式介面(單的應用程式介面( APIAPI ),將運用事件回呼機制,),將運用事件回呼機制,執行執行 XMLXML 文件的剖析。文件的剖析。

SAXSAX 目前的版本為目前的版本為 2.02.0 ,也是本章介紹,也是本章介紹 SAXSAX 所依循所依循的版本。的版本。

有關有關 SAXSAX 運作的機制,請參考下一節(運作的機制,請參考下一節( 15-1-215-1-2 節),節),至於至於 SAXSAX 的最新資訊,則請您到的最新資訊,則請您到 http://http://www.saxproject.org/www.saxproject.org/ 看看。看看。

至於至於 JavaJava 執行環境的建立請參考附錄執行環境的建立請參考附錄 E-1E-1 的說的說明,明, xercesxerces 剖析器的下載與安裝,則請參考剖析器的下載與安裝,則請參考 14-1-214-1-2節的說明。節的說明。

Page 3: 第  15  章  SAX 程式設計

簡介簡介 SAX SAX - SAX- SAX 的運作機制的運作機制

以以 SAXSAX 機制處理機制處理 XMLXML 文件的程式裡,有兩文件的程式裡,有兩個重要的主角:個重要的主角: 剖析剖析 XMLXML 文件的文件的 SAXSAX 剖析器剖析器 處理處理 XMLXML 文件的處理器(文件的處理器( handlerhandler ))

Page 4: 第  15  章  SAX 程式設計

簡介簡介 SAX SAX - - 瞭解事件回呼機制瞭解事件回呼機制

範例的運作機制,如下述:範例的運作機制,如下述: STEP 1STEP 1 、完成、完成 BitcParseBitcParse 物件的建立物件的建立 STEP 2STEP 2 、建立實做、建立實做 SAXHandlerSAXHandler 介面的介面的

myHandlermyHandler 處理器物件處理器物件 STEP 3STEP 3 、將、將 myHandlermyHandler 物件設定給物件設定給 BitcParseBitcParse 物物

件件 STEP 4STEP 4 、執行剖析、執行剖析 STEP 5STEP 5 、、 BitcParseBitcParse 物件透過物件透過 SAXHandlerSAXHandler 介介

面,呼叫面,呼叫 myHandlermyHandler 物件的方法物件的方法

Page 5: 第  15  章  SAX 程式設計

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

Page 6: 第  15  章  SAX 程式設計

簡介簡介 SAX SAX - - 瞭解事件回呼機制瞭解事件回呼機制

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

器物件器物件 剖析器類別如何回呼處理器物件的方法剖析器類別如何回呼處理器物件的方法

Page 7: 第  15  章  SAX 程式設計

SAXSAX 程式設計程式設計 - Java- Java 的的 SAXSAX 程程式設計式設計 在在 JavaJava 中,運用中,運用 SAXSAX 剖析器處理剖析器處理 XMLXML 文件的步驟文件的步驟

如下所述:如下所述: STEP 1STEP 1 、建立、建立 SAXSAX 剖析器物件剖析器物件 STEP 2STEP 2 、建立實做、建立實做 org.xml.saxorg.xml.sax 套件內介面的處套件內介面的處

理器類別。理器類別。 STEP 3STEP 3 、將處理器物件設定給、將處理器物件設定給 SAXSAX 剖析器物件剖析器物件 STEP 4STEP 4 、將欲剖析的、將欲剖析的 XMLXML 文件傳入文件傳入 SAXSAX 剖析剖析

器物件。器物件。 STEP 5STEP 5 、、 SAXSAX 剖析器在處理剖析器在處理 XMLXML 文件的過文件的過

程,將呼叫處理器物件回應剖析過程中所觸發事程,將呼叫處理器物件回應剖析過程中所觸發事件的方法。件的方法。

Page 8: 第  15  章  SAX 程式設計

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

Page 9: 第  15  章  SAX 程式設計

SAXSAX 程式設計程式設計- - 運用運用 SAXSAX 剖析器剖析剖析器剖析 XMLXML 文件文件 欲使用欲使用 Apache XercesApache Xerces 的的 SAXSAX 剖析器時,需剖析器時,需

運用運用 importimport 指令引用,敘述如下:指令引用,敘述如下:

由於剖析器物件將設定由類型為由於剖析器物件將設定由類型為 XMLReaderXMLReader介面的物件引用。因此,還必須引用介面的物件引用。因此,還必須引用org.xml.saxorg.xml.sax 套件。套件。

XMLReaderXMLReader 介面為使用事件回呼機制,讀取介面為使用事件回呼機制,讀取XMLXML 文件的介面。接著,完成剖析器物件的文件的介面。接著,完成剖析器物件的建立。建立。

Page 10: 第  15  章  SAX 程式設計

SAXSAX 程式設計程式設計- - 運用運用 SAXSAX 剖析器剖析剖析器剖析 XMLXML 文件文件 欲剖析欲剖析 XMLXML 文件時,則可呼叫文件時,則可呼叫 parse()parse() 方法,方法,

並傳入欲剖析的檔案名稱。以下敘述將完成並傳入欲剖析的檔案名稱。以下敘述將完成book.xmlbook.xml 文件的剖析。文件的剖析。

Page 11: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 內容處理器的建立內容處理器的建立

定義內容處理器類別時,必須實做定義於定義內容處理器類別時,必須實做定義於org.xml.saxorg.xml.sax 套件內的套件內的 ContentHandlerContentHandler 介面。因此,介面。因此,撰寫時,必須先完成套件與介面的引用。撰寫時,必須先完成套件與介面的引用。

由於由於 ContentHandlerContentHandler 介面內定義的事件回應介面內定義的事件回應方法,將丟出類型為方法,將丟出類型為 SAXExceptionSAXException 的例外物的例外物件,因此,在程式內亦必須完成引用。件,因此,在程式內亦必須完成引用。

Page 12: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 內容處理器的建內容處理器的建立立 欲將實做欲將實做 ContentHandlerContentHandler 介面的自訂內容處理器物介面的自訂內容處理器物

件,註冊給件,註冊給 SAXSAX 剖析器時,必須呼叫剖析器時,必須呼叫 XMLReaderXMLReader介面的介面的 setContentHandlersetContentHandler ,語法如下:,語法如下:

XMLReaderXMLReader 物件物件 .setContentHandler(.setContentHandler(ContentHandler ContentHandler 內容處理器內容處理器 ))

無回傳值。 無回傳值。

Page 13: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 內容處理器的建內容處理器的建立立 文件定位器的設定文件定位器的設定

設定文件定位器的方法為設定文件定位器的方法為 setDocumentLocator()setDocumentLocator() 方法,方法,其介面如下:其介面如下:

public void setDocumentLocator(Locator public void setDocumentLocator(Locator locator)locator)setDocumentLocator()setDocumentLocator() 方法是剖析方法是剖析 XMLXML 文件時,內文件時,內容處理器第容處理器第 11 個被呼叫的方法,用於設定個被呼叫的方法,用於設定 LocatorLocator 物物件,其型別為件,其型別為 org.xml.saxorg.xml.sax 套件內的套件內的 LocatorLocator 介面。介面。

在剖析在剖析 XMLXML 文件的過程中,欲取得目前剖析的位置文件的過程中,欲取得目前剖析的位置時,可以透過呼叫時,可以透過呼叫 LocatorLocator 物件之方法的方式得知。 物件之方法的方式得知。

Page 14: 第  15  章  SAX 程式設計

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

Page 15: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 內容處理器的建內容處理器的建立立 文件剖析的開始與結束文件剖析的開始與結束

當開始剖析當開始剖析 XMLXML 文件時,文件時, SAXSAX 剖析器將呼叫剖析器將呼叫startDocument()startDocument() 方法,介面如下:方法,介面如下:

public void startDocument() public void startDocument() throws SAXExceptionthrows SAXException

完成完成 XMLXML 文件的剖析時,則將呼叫文件的剖析時,則將呼叫 endDocument()endDocument()方法,這個方法也是方法,這個方法也是 SAXSAX 剖析器剖析剖析器剖析 XMLXML 文件最文件最後一個呼叫的方法,介面如下:後一個呼叫的方法,介面如下:

public void endDocument() public void endDocument() throws SAXExceptionthrows SAXException

Page 16: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 內容處理器的建內容處理器的建立立 名稱空間名稱空間

自自 SAX 2.0SAX 2.0 開始,增加了對名稱空間的支援,開始,增加了對名稱空間的支援,當開始處理名稱空間時,將呼叫當開始處理名稱空間時,將呼叫startPrefixMapping()startPrefixMapping() 方法。方法。

完成名稱空間的處理時,則將呼叫完成名稱空間的處理時,則將呼叫endPrefixMapping()endPrefixMapping() 方法。介面說明如下:方法。介面說明如下:

public void startPrefixMapping(public void startPrefixMapping(String prefix, String uri)String prefix, String uri)

throws SAXExceptionthrows SAXExceptionpublic void endPrefixMapping(public void endPrefixMapping(

String prefix) throws SAXExceptionString prefix) throws SAXException

Page 17: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 內容處理器的建內容處理器的建立立 處理指令處理指令

當剖析到當剖析到 XMLXML 文件內傳遞給應用程式的處理文件內傳遞給應用程式的處理指令時,將呼叫指令時,將呼叫 processingInstructiong()processingInstructiong() 方方法,其介面如下:法,其介面如下:

public void processingInstruction(public void processingInstruction(String target, String data)String target, String data)

throws SAXExceptionthrows SAXException

Page 18: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 內容處理器的建內容處理器的建立立 元素元素

開始剖析開始剖析 XMLXML 文件內的元素時,文件內的元素時, SAXSAX 剖析器將呼剖析器將呼叫叫 startElement()startElement() 方法。結束元素的剖析,則呼叫方法。結束元素的剖析,則呼叫endElementendElement 。介面說明如下:。介面說明如下:

public void startElement(public void startElement(String namespaceURI, String namespaceURI, String localName, String qName,String localName, String qName,Attributes atts) throws SAXExceptionAttributes atts) throws SAXException

public void endElement (String public void endElement (String namespaceURI,namespaceURI,

String localName, String qName) String localName, String qName) throws SAXExceptionthrows SAXException

Page 19: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 內容處理器的建內容處理器的建立立 元素元素

開始剖析開始剖析 XMLXML 文件內的元素時,文件內的元素時, SAXSAX 剖析器將呼剖析器將呼叫叫 startElement()startElement() 方法。結束元素的剖析,則呼叫方法。結束元素的剖析,則呼叫endElementendElement 。介面說明如下:。介面說明如下:

public void startElement(public void startElement(String namespaceURI, String namespaceURI, String localName, String qName,String localName, String qName,Attributes atts) throws SAXExceptionAttributes atts) throws SAXException

public void endElement (String public void endElement (String namespaceURI,namespaceURI,

String localName, String qName) String localName, String qName) throws SAXExceptionthrows SAXException

Page 20: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 內容處理器的建內容處理器的建立立 欲取得屬性的個數時,可呼叫欲取得屬性的個數時,可呼叫 getLength()getLength() 方法,語方法,語

法如下:法如下:AttributesAttributes 物件物件 .getLength();.getLength();

回傳值型態為回傳值型態為 intint 。。 欲取得屬性名稱時,可呼叫欲取得屬性名稱時,可呼叫 getLocalName()getLocalName() 方法,方法,

語法如下:語法如下:AttributesAttributes 物件物件 .getLocalName(int i);.getLocalName(int i);

回傳值型態為回傳值型態為 StringString 。 。 欲取得屬性值時,可呼叫欲取得屬性值時,可呼叫 getValue()getValue() 方法,方法,

語法如下:語法如下:AttributesAttributes 物件物件 .getValue(int i);.getValue(int i);

回傳值型態為回傳值型態為 StringString 。 。

Page 21: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 內容處理器的建內容處理器的建立立 元素資料元素資料

處理元素資料時,將呼叫處理元素資料時,將呼叫 characters()characters() 方法,方法,其介面如下:其介面如下:

public void characters(public void characters(char ch[], int start, int length)char ch[], int start, int length)

throws SAXExceptionthrows SAXException

Page 22: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 內容處理器的建內容處理器的建立立 空白字元空白字元

剖析器遇到空白字元時,將呼叫剖析器遇到空白字元時,將呼叫 characters()characters()方法,其介面如下:方法,其介面如下:

public void ignorableWhitespace(public void ignorableWhitespace(char ch[], int start, int length)char ch[], int start, int length)

throws SAXExceptionthrows SAXException

Page 23: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 內容處理器的建內容處理器的建立立 被忽略的實體被忽略的實體

對於某些不需要驗證對於某些不需要驗證 XMLXML 文件的剖析器,在文件的剖析器,在剖析剖析 XMLXML 文件的過程中,可能略過實體宣告。文件的過程中,可能略過實體宣告。因此,因此, SAX 2.0SAX 2.0 提供了提供了 skippedEntity()skippedEntity() 方法,方法,讓實體被略過時,透過此方法的呼叫,可取讓實體被略過時,透過此方法的呼叫,可取得略過實體的名稱。介面說明如下:得略過實體的名稱。介面說明如下:

public void skippedEntity(String name)public void skippedEntity(String name)throws SAXExceptionthrows SAXException

Page 24: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 錯誤處理器的建錯誤處理器的建立立 對於對於 XMLXML 文件錯誤的處理,則將交由實做文件錯誤的處理,則將交由實做

ErrorHandlerErrorHandler 介面的錯誤處理器。介面的錯誤處理器。 當錯誤處理器完成錯誤的處理後,當錯誤處理器完成錯誤的處理後, SAXSAX 剖析器最後剖析器最後

將呼叫內容處理器的將呼叫內容處理器的 endDocument()endDocument() 方法,結束方法,結束XMLXML 文件的處理。文件的處理。

定義錯誤處理器類別時,必須實做定義於定義錯誤處理器類別時,必須實做定義於org.xml.saxorg.xml.sax 套件內的套件內的 ErrorHandlerErrorHandler 介面。因此,撰介面。因此,撰寫時,必須先完成該介面與套件的引用。寫時,必須先完成該介面與套件的引用。

Page 25: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 錯誤處理器的建錯誤處理器的建立立 由於由於 SAXSAX 剖析器呼叫剖析器呼叫 ErrorHandlerErrorHandler 介面內定義的事介面內定義的事

件回應方法,將傳入類型為件回應方法,將傳入類型為 SAXParseExceptionSAXParseException 的例的例外物件,因此,在程式內亦必須完成引用。外物件,因此,在程式內亦必須完成引用。

欲將實做欲將實做 ErrorHandlerErrorHandler 介面的自訂錯誤處理器物件介面的自訂錯誤處理器物件註冊給註冊給 SAXSAX 剖析器時,必須呼叫剖析器時,必須呼叫 XMLReaderXMLReader 介面介面的的 setErrorHandlersetErrorHandler ,語法如下:,語法如下:

XMLReaderXMLReader 物件物件 .setErrorHandler(.setErrorHandler(ErrorHandler ErrorHandler 錯誤處理器錯誤處理器 ))

無回傳值。 無回傳值。

Page 26: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 錯誤處理器的建錯誤處理器的建立立 警告訊息警告訊息

當當 SAXSAX 剖析器剖析剖析器剖析 XMLXML 文件時,發出警告訊息,文件時,發出警告訊息,將由將由 ErrorHandlerErrorHandler 介面的介面的 warning()warning() 方法回應,其方法回應,其介面如下:介面如下:

public void warning(public void warning(SAXParseException saxpe)SAXParseException saxpe)

錯誤訊息錯誤訊息當當 SAXSAX 剖析器剖析剖析器剖析 XMLXML 文件時,發出錯誤訊息,文件時,發出錯誤訊息,將由將由 ErrorHandlerErrorHandler 介面的介面的 error()error() 方法回應,其介面方法回應,其介面如下:如下:

public void error(SAXParseException saxpe)public void error(SAXParseException saxpe)

Page 27: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 錯誤處理器的建錯誤處理器的建立立 嚴重錯誤訊息嚴重錯誤訊息

當當 SAXSAX 剖析器剖析剖析器剖析 XMLXML 文件時,發出嚴重錯誤訊文件時,發出嚴重錯誤訊息(又稱不可回復的錯誤),將由息(又稱不可回復的錯誤),將由 ErrorHandlerErrorHandler 介介面的面的 fatalError()fatalError() 方法回應,其介面如下:方法回應,其介面如下:

public void fatalError(SAXParseException public void fatalError(SAXParseException saxpe)saxpe)

Page 28: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 錯誤處理器的建錯誤處理器的建立立 透過透過 SAXParseExceptionSAXParseException 物件取得錯誤訊息物件取得錯誤訊息

資料資料當當 SAXSAX 剖析器發出錯誤訊息時,呼叫錯誤處剖析器發出錯誤訊息時,呼叫錯誤處理的各種方法時,均會傳入包含錯誤訊息的理的各種方法時,均會傳入包含錯誤訊息的SAXParseExceptionSAXParseException 例外物件。例外物件。

Page 29: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 錯誤處理器的建錯誤處理器的建立立 下表為下表為 SAXParseExceptionSAXParseException 例外類別用於取得錯誤訊例外類別用於取得錯誤訊

息的方法。息的方法。

Page 30: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 以繼承以繼承 DefalutHandlerDefalutHandler 類別建立的內容處類別建立的內容處理器理器 org.xml.saxorg.xml.sax 套件提供套件提供 DefaultHandlerDefaultHandler 類別,讓程式類別,讓程式

設計師可透過繼承的方式,建立各種處理器。設計師可透過繼承的方式,建立各種處理器。 在在 DefaultHandlerDefaultHandler 類別內,已經完成類別內,已經完成 SAXSAX 剖析器所剖析器所

需要的四種處理器介面所定義方法的實做。需要的四種處理器介面所定義方法的實做。 程式設計師只要以繼承程式設計師只要以繼承 DefaultHandlerDefaultHandler 類別的方式,類別的方式,

建立自訂處理器類別,並僅需要針對想要處理的部份,建立自訂處理器類別,並僅需要針對想要處理的部份,透過重載(透過重載( overridingoverriding )方法的機制,完成)方法的機制,完成 XMLXML 文文件的處理。件的處理。

當然那些自訂處理器類別沒有重載的方法,當然那些自訂處理器類別沒有重載的方法, SAXSAX 剖剖析器呼叫時,便將由析器呼叫時,便將由 DefaultHandlerDefaultHandler 類別定義的方類別定義的方法回應。 法回應。

Page 31: 第  15  章  SAX 程式設計

SAXSAX 程式設計 程式設計 - - 以繼承以繼承 DefalutHandlerDefalutHandler 類別建立的內容處類別建立的內容處理器理器 欲使用欲使用 DefaultHandlerDefaultHandler 類別時,必須運用類別時,必須運用 importimport 敘敘

述完成類別的引用。述完成類別的引用。