第 15 章 sax2建立xml應用程式

26
15 15 SAX2 SAX2 第第 第第 XML XML 第第第第 第第第第 15-1 SAX2 15-1 SAX2 第第第 第第第 15-2 15-2 第第 第第 VB VB 第第 第第 SAX SAX 第第第第 第第第第 15-3 15-3 第第第第 第第 第第第第 第第 XML XML 第第 第第 15-4 15-4 第第第第 第第 第第第第 第第 XML XML 第第第第第第 第第第第第第

Upload: erich-brady

Post on 30-Dec-2015

43 views

Category:

Documents


1 download

DESCRIPTION

第 15 章 SAX2建立XML應用程式. 15-1 SAX2 的基礎 15-2 使用 VB 建立 SAX 應用程式 15-3 應用實例:顯示 XML 文件 15-4 應用實例:計算 XML 元素數目和值. 15-1 SAX2的基礎. SAX2 是什麼 DOM 和 SAX 的差異 SAX 的優缺點. SAX2 是什麼. - PowerPoint PPT Presentation

TRANSCRIPT

第第 1515 章 章 SAX2SAX2建立建立 XMLXML應用程應用程式式

15-1 SAX215-1 SAX2 的基礎的基礎 15-2 15-2 使用使用 VBVB 建立建立 SAXSAX 應用程式應用程式 15-3 15-3 應用實例:顯示應用實例:顯示 XMLXML 文件文件 15-4 15-4 應用實例:計算應用實例:計算 XMLXML 元素數目和值元素數目和值

15-1 SAX215-1 SAX2的基礎的基礎 SAX2SAX2 是什麼是什麼 DOMDOM和和 SAXSAX 的差異的差異 SAXSAX 的優缺點的優缺點

SAX2SAX2 是什麼是什麼 SAX2SAX2是是 Simple API for XML version 2Simple API for XML version 2 ,也,也

就是就是 SAXSAX 版本版本 22 ,這是一組程式設計介面,將,這是一組程式設計介面,將XMLXML 文件視為一個文字流的資料,在讀取文件視為一個文字流的資料,在讀取 XMLXML元素時觸發一系列的事件,只需撰寫事件處理程元素時觸發一系列的事件,只需撰寫事件處理程序,就可以取得序,就可以取得 XMLXML 元素的內容。元素的內容。

SAXSAX 技術屬於一種開放的標準,原來主要為針對技術屬於一種開放的標準,原來主要為針對JavaJava 提供的程式設計介面,目前微軟已經將提供的程式設計介面,目前微軟已經將SAX2SAX2 技術加入了技術加入了 MSXMLMSXML 剖析器,所以剖析器,所以 COMCOM相容的程式語言,例如:相容的程式語言,例如: Visual BasicVisual Basic、、 Visual Visual C++C++ 都可以使用都可以使用 SAXSAX 技術開發技術開發 XMLXML 應用程式。應用程式。

DOMDOM和和 SAXSAX 的差異的差異 -1-1

DOMDOM和和 SAXSAX 技術的差異,我們可以來看技術的差異,我們可以來看看看 DOMDOM和和 SAXSAX 到底是如何剖析到底是如何剖析 XMLXML 文文件,使用的件,使用的 XMLXML 文件範例很簡單,如下所文件範例很簡單,如下所示:示:<hello><hello>

<message><message> 大家好!大家好! </message></message>

<message>Say Hello<message>Say Hello!! </message></message>

</hello></hello>

DOMDOM和和 SAXSAX 的差異的差異 -2-2

DOMDOM 如何剖析如何剖析 XMLXML 文件文件 如果使用如果使用 DOMDOM 剖析剖析 XMLXML 文件,在建立文件,在建立

XMLDOMXMLDOM 物件後使用物件後使用 loadload 方法載入方法載入 XMLXML文件,這是一個樹狀結構的節點,如下圖文件,這是一個樹狀結構的節點,如下圖所示:所示:

DOMDOM和和 SAXSAX 的差異的差異 -3-3

SAXSAX 如何剖析如何剖析 XMLXML 文件文件 11 當使用當使用 SAXSAX 載入載入 XMLXML 文件,它的操作有文件,它的操作有

如開啟一個「循序檔案」如開啟一個「循序檔案」 (Sequential (Sequential File)File) ,將,將 XMLXML 元素和內容視為文字檔案元素和內容視為文字檔案的字元讀入,在讀到的字元讀入,在讀到 XMLXML 元素的開始標籤、元素的開始標籤、結尾標籤和內容時將產生一系列的事件,結尾標籤和內容時將產生一系列的事件,如下所示:如下所示:startDocumentstartDocument、、 startElementstartElement、、 charactecharacte

rsrs、、 endElementendElement、、 endDocumentendDocument

DOMDOM和和 SAXSAX 的差異的差異 -4-4

SAXSAX 如何剖析如何剖析 XMLXML 文件文件 22 以前面的範例文件為例,以前面的範例文件為例, SAXSAX 讀入的資料讀入的資料

如同一個文字流,如下所示:如同一個文字流,如下所示:[<hello>] [<message>] [[<hello>] [<message>] [ 大家好!大家好! ] ]

[</message>] [<message>] [Say Hell[</message>] [<message>] [Say Helloo!! ] [</message>] [</hello>]] [</message>] [</hello>]

SAXSAX 的優缺點的優缺點 -1-1

SAXSAX 的優點的優點 SAXSAX 技術是將技術是將 XMLXML 文件視為一個讀取檔案的文文件視為一個讀取檔案的文

字流,在開發應用程式上,其優點如下所示:字流,在開發應用程式上,其優點如下所示:• 記憶體的使用比較有效率:因為記憶體的使用比較有效率:因為 SAXSAX 並不會將並不會將 XMLXML

文件完全載入記憶體,所以任何尺寸的文件完全載入記憶體,所以任何尺寸的 XMLXML 文件都可文件都可以剖析,以剖析, DOMDOM 技術需將整份技術需將整份 XMLXML 文件載入記憶體,文件載入記憶體,以建立樹狀結構。以建立樹狀結構。

• 使用容易:如果應用程式只是取得使用容易:如果應用程式只是取得 XMLXML 文件的部分文件的部分XMLXML 元素,此時元素,此時 SAXSAX 在使用上更加容易。因為在使用上更加容易。因為 SAXSAX不用如同不用如同 DOMDOM 將整份將整份 XMLXML 文件載入記憶體。文件載入記憶體。

• 速度快:如果應用程式只是在順序讀取速度快:如果應用程式只是在順序讀取 XMLXML 文件的內文件的內容,容, SAXSAX 在處理上將比在處理上將比 DOMDOM 更有效率。更有效率。

SAXSAX 的優缺點的優缺點 -2-2

SAXSAX 使用上的限制使用上的限制 SAXSAX 技術和技術和 DOMDOM 使用完全不同的方法剖析使用完全不同的方法剖析 XMLXML

文件,所以在使用上有一些限制,如下所示:文件,所以在使用上有一些限制,如下所示:• SAXSAX 只能讀取只能讀取 XMLXML 內容:內容: SAXSAX 技術只能讀取技術只能讀取 XMLXML 文文

件,但是不能更改件,但是不能更改 XMLXML 文件的內容,不同於文件的內容,不同於 DOMDOM 介介面能夠輕易的讀寫面能夠輕易的讀寫 XMLXML 文件的內容。文件的內容。

• 無法隨機存取無法隨機存取 XMLXML 元素:元素: SAXSAX 技術有如讀取文字檔技術有如讀取文字檔案的內容,案的內容, XMLXML 元素是一個接著一個元素是一個接著一個 XMLXML 元素以順元素以順序方式讀取序方式讀取 XMLXML 元素,這是無法回頭的,不同於元素,這是無法回頭的,不同於DOMDOM將將 XMLXML 文件視為一個樹狀結構,可以任易取得文件視為一個樹狀結構,可以任易取得指定指定 XMLXML 元素的資料。元素的資料。

15-2 15-2 使用使用 VBVB 建立建立 SAXSAX 應用程應用程式式

SAXSAX 應用程式介面應用程式介面 ContentHandlerContentHandler 介面介面 ErrorHandlerErrorHandler 介面介面 XMLReaderXMLReader 介面介面 AttributesAttributes 介面介面 LocatorLocator 介面介面

SAXSAX 應用程式介面應用程式介面 -1-1

SAXSAX 屬於一種「主動模式剖析器」屬於一種「主動模式剖析器」 (Push-(Push-model Parser)model Parser) ,當,當 SAXSAX 剖析剖析 XMLXML 文件文件時,時, SAXXMLReaderSAXXMLReader 介面在讀取介面在讀取 XMLXML 文文件時同時觸發一系列事件,件時同時觸發一系列事件, SAXSAX 就是處理就是處理事件的應用程式介面。事件的應用程式介面。

SAXSAX 應用程式介面應用程式介面 -2-2

SAXSAX 就是處理事件的應用程式介面,主要就是處理事件的應用程式介面,主要的介面如下表所示:的介面如下表所示:介面 說明

ContentHandler SAX主要的應用程式介面,處理 XML文件的內容ErrorHandler 處理在剖析過程產生的錯誤,共有三種錯誤,可回復錯誤、致命

錯誤和警告錯誤DTDHandler 處理沒有進行剖析的實體和記法宣告LexicalHandler 處理詞彙,例如:註解、CDATA區塊、實體參考等DeclHandler 處理 XML元素和屬性宣告EntityResolver 允許應用程式處理外部實體XMLReader 處理 XML文件的剖析Attributes 提供取得 XML文件的屬性Locator 提供事件發生時,XML文件的位置行和列

ContentHandlerContentHandler 介面介面 -1-1

startDocumentstartDocument 方法方法 當開始剖析當開始剖析 XMLXML 文件時觸發此事件,我們文件時觸發此事件,我們

可以建立程序處理此事件,這是可以建立程序處理此事件,這是ContentHandlerContentHandler 介面的第一個方介面的第一個方法,法, Visual BasicVisual Basic 的程序,如下所示:的程序,如下所示:Private Sub Private Sub

IVBSAXContentHandler_startDocument()IVBSAXContentHandler_startDocument() … …....End SubEnd Sub

ContentHandlerContentHandler 介面介面 -2-2

startElementstartElement 方法方法 當剖析到每一個當剖析到每一個 XMLXML 元素時,處理開始標籤名稱元素時,處理開始標籤名稱

和屬性清單的方法,和屬性清單的方法, Visual BasicVisual Basic 的程序,如下的程序,如下所示:所示:

Private Sub Private Sub IVBSAXContentHandler_startElement(strNaIVBSAXContentHandler_startElement(strNamespaceURI As String, strLocalName As mespaceURI As String, strLocalName As String, strQName As String, ByVal String, strQName As String, ByVal oAttributes As MSXML2.IVBSAXAttributes)oAttributes As MSXML2.IVBSAXAttributes)

… …....End SubEnd Sub

ContentHandlerContentHandler 介面介面 -3-3

characterscharacters 方法方法 這個方法取得這個方法取得 XMLXML 元素內容的文字資元素內容的文字資

料,料, Visual BasicVisual Basic 的程序,如下所示:的程序,如下所示:Private Sub Private Sub

IVBSAXContentHandler_characters(strCharIVBSAXContentHandler_characters(strChars As String)s As String)

… …....End SubEnd Sub 上述程序傳入的參數上述程序傳入的參數 strCharsstrChars 就是元素的內容,就是元素的內容,

這個方法執行的順序是在這個方法執行的順序是在 startElementstartElement和和endElementendElement 方法間。方法間。

ContentHandlerContentHandler 介面介面 -4-4

endElementendElement 方法方法 這個方法處理這個方法處理 XMLXML 元素的結尾標籤名元素的結尾標籤名

稱,稱, Visual BasicVisual Basic 的程序,如下所示:的程序,如下所示:Private Sub Private Sub

IVBSAXContentHandler_endElement(strNaIVBSAXContentHandler_endElement(strNamespaceURI As String, strLocalName As mespaceURI As String, strLocalName As String, strQName As String)String, strQName As String)

… …....

End SubEnd Sub 上述程序的參數上述程序的參數 strLocalNamestrLocalName 就是標籤名稱。就是標籤名稱。

ContentHandlerContentHandler 介面介面 -5-5

endDocumentendDocument 方法方法 當當 SAXSAX 剖析器處理到剖析器處理到 XMLXML 文件的最後就文件的最後就

觸發此事件,觸發此事件, Visual BasicVisual Basic 的程序,如下的程序,如下所示:所示:Private Sub Private Sub

IVBSAXContentHandler_endDocument()IVBSAXContentHandler_endDocument()

… …....

End SubEnd Sub

ContentHandlerContentHandler 介面介面 -6-6

processingInstructionprocessingInstruction 方法方法 如果如果 XMLXML 文件擁有文件擁有 PIPI ,這個方法就是處理,這個方法就是處理 XMLXML

文件的文件的 PIPI,, Visual BasicVisual Basic 的程序,如下所示:的程序,如下所示:Private Sub Private Sub

IVBSAXContentHandler_processingInstructiIVBSAXContentHandler_processingInstruction(strTarget As String, strData As String)on(strTarget As String, strData As String)

… …....

End SubEnd Sub 上述程序的參數上述程序的參數 strTargetstrTarget 就是就是 PIPI 目標目標 (PI (PI

Target)Target),, strDatastrData 就是值。就是值。

ErrorHandlerErrorHandler 介面介面 -1-1

ErrorHandlerErrorHandler 介面可以追蹤剖析的錯誤,取得錯介面可以追蹤剖析的錯誤,取得錯誤發生時的錯誤資訊,共擁有三種錯誤型態。誤發生時的錯誤資訊,共擁有三種錯誤型態。

可回復錯誤可回復錯誤 (Recoverable errors)(Recoverable errors) :物件類別:物件類別模組的方法,如下所示:模組的方法,如下所示:

Private Sub IVBSAXErrorHandler_error(ByVal Private Sub IVBSAXErrorHandler_error(ByVal oLocator As MSXML2.IVBSAXLocator, oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal strErrorMessage As String, ByVal nErrorCode As Long)nErrorCode As Long)

… …....

End SubEnd Sub

ErrorHandlerErrorHandler 介面介面 -2-2

致命錯誤致命錯誤 (Fatal errors)(Fatal errors) :物件類別模組:物件類別模組的方法,如下所示:的方法,如下所示:

Private Sub Private Sub IVBSAXErrorHandler_fatalError(ByVal IVBSAXErrorHandler_fatalError(ByVal oLocator As MSXML2.IVBSAXLocator, oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal strErrorMessage As String, ByVal nErrorCode As Long)nErrorCode As Long)

… …....End SubEnd Sub

ErrorHandlerErrorHandler 介面介面 -3-3

警告訊息警告訊息 (Warnings)(Warnings) :物件類別模組的方法,:物件類別模組的方法,如下所示:如下所示:

Private Sub Private Sub IVBSAXErrorHandler_ignorableWarning(ByIVBSAXErrorHandler_ignorableWarning(ByVal oLocator As MSXML2.IVBSAXLocator, Val oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal strErrorMessage As String, ByVal nErrorCode As Long)nErrorCode As Long)

… …....

End SubEnd Sub

XMLReaderXMLReader 介面介面 -1-1

這個介面提供這個介面提供 XMLXML 文件的載入和剖析功能,文件的載入和剖析功能,我們並不需要替此介面建立對應的程序,我們並不需要替此介面建立對應的程序,因為這個介面直接由剖析器處理。因為這個介面直接由剖析器處理。

XMLReaderXMLReader 介面的方法介面的方法 XMLReaderXMLReader 介面的主要方法,如下表所示:介面的主要方法,如下表所示:

方法 說明parse 剖析 XML文件的字串

parseURL 剖析 XML文件檔案,可以是路徑或 URL

XMLReaderXMLReader 介面介面 -2-2

XMLReaderXMLReader 介面的屬性介面的屬性 XMLReaderXMLReader 介面的屬性,如下表所示:介面的屬性,如下表所示:

屬性 說明contentHandler 指定 ContentHandler介面使用者自訂的類別名稱errorHandler 指定 ErrorHandler介面使用者自訂的類別名稱baseURL XML文件的基底 URL

AttributesAttributes 介面介面 -1-1

這個介面取得這個介面取得 XMLXML 元素的屬性清單,我們元素的屬性清單,我們並不需要替此介面建立對應的程序,因為並不需要替此介面建立對應的程序,因為這個介面直接由剖析器處理。這個介面直接由剖析器處理。

AttributesAttributes 介面的方法介面的方法方法 說明

getIndexFromName 取得屬性的索引編號getValueFromName 使用屬性名稱取得屬性值,傳入的為屬性名稱

getValue 取得屬性值,傳入的為屬性索引編號getLocalName 取得屬性名稱,傳入的為屬性索引編號

getType 取得 DTD屬性宣告的資料型態

AttributesAttributes 介面介面 -2-2

AttributesAttributes 介面的屬性介面的屬性 AttributesAttributes 介面的屬性,如下表所示:介面的屬性,如下表所示:

屬性 說明length 取得元素擁有的屬性數

LocatorLocator 介面介面 LocatorLocator 介面提供目前剖析的位置資訊,介面提供目前剖析的位置資訊,

主要為下列兩個屬性,如下表所示:主要為下列兩個屬性,如下表所示:屬性 說明

columnNumber 取得所在列lineNumber 取得所在行