第15章 SAX2建立XML應用程式 15-1 SAX2的基礎 15-2 使用VB建立SAX應用程式 15-3 應用實例:顯示XML文件
15-1 SAX2的基礎 SAX2是什麼 DOM和SAX的差異 SAX的優缺點
SAX2是什麼 SAX2是Simple API for XML version 2,也就是SAX版本2,這是一組程式設計介面,將XML文件視為一個文字流的資料,在讀取XML元素時觸發一系列的事件,只需撰寫事件處理程序,就可以取得XML元素的內容。 SAX技術屬於一種開放的標準,原來主要為針對Java提供的程式設計介面,目前微軟已經將SAX2技術加入了MSXML剖析器,所以COM相容的程式語言,例如:Visual Basic、Visual C++都可以使用SAX技術開發XML應用程式。
DOM和SAX的差異-1 DOM和SAX技術的差異,我們可以來看看DOM和SAX到底是如何剖析XML文件,使用的XML文件範例很簡單,如下所示: <hello> <message>大家好!</message> <message>Say Hello!</message> </hello>
DOM和SAX的差異-2 DOM如何剖析XML文件 如果使用DOM剖析XML文件,在建立XMLDOM物件後使用load方法載入XML文件,這是一個樹狀結構的節點,如下圖所示:
DOM和SAX的差異-3 SAX如何剖析XML文件1 當使用SAX載入XML文件,它的操作有如開啟一個「循序檔案」(Sequential File),將XML元素和內容視為文字檔案的字元讀入,在讀到XML元素的開始標籤、結尾標籤和內容時將產生一系列的事件,如下所示: startDocument、startElement、characters、endElement、endDocument
DOM和SAX的差異-4 SAX如何剖析XML文件2 以前面的範例文件為例,SAX讀入的資料如同一個文字流,如下所示: [<hello>] [<message>] [大家好!] [</message>] [<message>] [Say Hello!] [</message>] [</hello>]
SAX的優缺點-1 SAX的優點 SAX技術是將XML文件視為一個讀取檔案的文字流,在開發應用程式上,其優點如下所示: 記憶體的使用比較有效率:因為SAX並不會將XML文件完全載入記憶體,所以任何尺寸的XML文件都可以剖析,DOM技術需將整份XML文件載入記憶體,以建立樹狀結構。 使用容易:如果應用程式只是取得XML文件的部分XML元素,此時SAX在使用上更加容易。因為SAX不用如同DOM將整份XML文件載入記憶體。 速度快:如果應用程式只是在順序讀取XML文件的內容,SAX在處理上將比DOM更有效率。
SAX的優缺點-2 SAX使用上的限制 SAX技術和DOM使用完全不同的方法剖析XML文件,所以在使用上有一些限制,如下所示: SAX只能讀取XML內容:SAX技術只能讀取XML文件,但是不能更改XML文件的內容,不同於DOM介面能夠輕易的讀寫XML文件的內容。 無法隨機存取XML元素:SAX技術有如讀取文字檔案的內容,XML元素是一個接著一個XML元素以順序方式讀取XML元素,這是無法回頭的,不同於DOM將XML文件視為一個樹狀結構,可以任易取得指定XML元素的資料。
15-2 使用VB建立SAX應用程式 SAX應用程式介面 ContentHandler介面 ErrorHandler介面 XMLReader介面 Attributes介面 Locator介面
SAX應用程式介面-1 SAX屬於一種「主動模式剖析器」(Push-model Parser),當SAX剖析XML文件時,SAXXMLReader介面在讀取XML文件時同時觸發一系列事件,SAX就是處理事件的應用程式介面。
SAX應用程式介面-2 SAX就是處理事件的應用程式介面,主要的介面如下表所示:
ContentHandler介面-1 startDocument方法 當開始剖析XML文件時觸發此事件,我們可以建立程序處理此事件,這是ContentHandler介面的第一個方法,Visual Basic的程序,如下所示: Private Sub IVBSAXContentHandler_startDocument() ….. End Sub
ContentHandler介面-2 startElement方法 當剖析到每一個XML元素時,處理開始標籤名稱和屬性清單的方法,Visual Basic的程序,如下所示: Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As String, strLocalName As String, strQName As String, ByVal oAttributes As MSXML2.IVBSAXAttributes) ….. End Sub
ContentHandler介面-3 characters方法 這個方法取得XML元素內容的文字資料,Visual Basic的程序,如下所示: Private Sub IVBSAXContentHandler_characters(strChars As String) ….. End Sub 上述程序傳入的參數strChars就是元素的內容,這個方法執行的順序是在startElement和endElement方法間。
ContentHandler介面-4 endElement方法 這個方法處理XML元素的結尾標籤名稱,Visual Basic的程序,如下所示: Private Sub IVBSAXContentHandler_endElement(strNamespaceURI As String, strLocalName As String, strQName As String) ….. End Sub 上述程序的參數strLocalName就是標籤名稱。
ContentHandler介面-5 endDocument方法 當SAX剖析器處理到XML文件的最後就觸發此事件,Visual Basic的程序,如下所示: Private Sub IVBSAXContentHandler_endDocument() ….. End Sub
ContentHandler介面-6 processingInstruction方法 如果XML文件擁有PI,這個方法就是處理XML文件的PI,Visual Basic的程序,如下所示: Private Sub IVBSAXContentHandler_processingInstruction(strTarget As String, strData As String) ….. End Sub 上述程序的參數strTarget就是PI目標(PI Target),strData就是值。
ErrorHandler介面-1 ErrorHandler介面可以追蹤剖析的錯誤,取得錯誤發生時的錯誤資訊,共擁有三種錯誤型態。 可回復錯誤(Recoverable errors):物件類別模組的方法,如下所示: Private Sub IVBSAXErrorHandler_error(ByVal oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal nErrorCode As Long) ….. End Sub
ErrorHandler介面-2 致命錯誤(Fatal errors):物件類別模組的方法,如下所示: Private Sub IVBSAXErrorHandler_fatalError(ByVal oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal nErrorCode As Long) ….. End Sub
ErrorHandler介面-3 警告訊息(Warnings):物件類別模組的方法,如下所示: Private Sub IVBSAXErrorHandler_ignorableWarning(ByVal oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal nErrorCode As Long) ….. End Sub
XMLReader介面-1 這個介面提供XML文件的載入和剖析功能,我們並不需要替此介面建立對應的程序,因為這個介面直接由剖析器處理。
XMLReader介面-2 XMLReader介面的屬性 XMLReader介面的屬性,如下表所示:
Attributes介面-1 這個介面取得XML元素的屬性清單,我們並不需要替此介面建立對應的程序,因為這個介面直接由剖析器處理。
Attributes介面-2 Attributes介面的屬性 Attributes介面的屬性,如下表所示:
Locator介面 Locator介面提供目前剖析的位置資訊,主要為下列兩個屬性,如下表所示: