Transcript Document
第15章 SAX2建立XML應用程式 15-1 15-2 15-3 15-4 SAX2的基礎 使用VB建立SAX應用程式 應用實例:顯示XML文件 應用實例:計算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屬於一種「主動模式剖析器」(Pushmodel Parser),當SAX剖析XML文件時, SAXXMLReader介面在讀取XML文件時同 時觸發一系列事件,SAX就是處理事件的 應用程式介面。 SAX應用程式介面-2 SAX就是處理事件的應用程式介面,主要 的介面如下表所示: 介面 ContentHandler ErrorHandler DTDHandler LexicalHandler DeclHandler EntityResolver XMLReader Attributes Locator 說明 SAX 主要的應用程式介面,處理 XML 文件的內容 處理在剖析過程產生的錯誤,共有三種錯誤,可回復錯誤、致命 錯誤和警告錯誤 處理沒有進行剖析的實體和記法宣告 處理詞彙,例如:註解、CDATA 區塊、實體參考等 處理 XML 元素和屬性宣告 允許應用程式處理外部實體 處理 XML 文件的剖析 提供取得 XML 文件的屬性 提供事件發生時,XML 文件的位置行和列 ContentHandler介面-1 startDocument方法 當開始剖析XML文件時觸發此事件,我們 可以建立程序處理此事件,這是 ContentHandler介面的第一個方法, Visual Basic的程序,如下所示: Private Sub IVBSAXContentHandler_startDocument() ….. End Sub ContentHandler介面-2 startElement方法 當剖析到每一個XML元素時,處理開始標籤名稱 和屬性清單的方法,Visual Basic的程序,如下 所示: Private Sub IVBSAXContentHandler_startElement(strN amespaceURI 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(strCha rs As String) ….. End Sub 上述程序傳入的參數strChars就是元素的內容, 這個方法執行的順序是在startElement和 endElement方法間。 ContentHandler介面-4 endElement方法 這個方法處理XML元素的結尾標籤名稱,Visual Basic的程序,如下所示: Private Sub IVBSAXContentHandler_endElement(strNa mespaceURI 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_processingInstruct ion(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(By Val oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal nErrorCode As Long) ….. End Sub XMLReader介面-1 這個介面提供XML文件的載入和剖析功能, 我們並不需要替此介面建立對應的程序, 因為這個介面直接由剖析器處理。 XMLReader介面的方法 XMLReader介面的主要方法,如下表所示: 方法 parse parseURL 說明 剖析 XML 文件的字串 剖析 XML 文件檔案,可以是路徑或 URL XMLReader介面-2 XMLReader介面的屬性 XMLReader介面的屬性,如下表所示: 屬性 contentHandler errorHandler baseURL 說明 指定 ContentHandler 介面使用者自訂的類別名稱 指定 ErrorHandler 介面使用者自訂的類別名稱 XML 文件的基底 URL Attributes介面-1 這個介面取得XML元素的屬性清單,我們 並不需要替此介面建立對應的程序,因為 這個介面直接由剖析器處理。 Attributes介面的方法 方法 getIndexFromName getValueFromName getValue getLocalName getType 說明 取得屬性的索引編號 使用屬性名稱取得屬性值,傳入的為屬性名稱 取得屬性值,傳入的為屬性索引編號 取得屬性名稱,傳入的為屬性索引編號 取得 DTD 屬性宣告的資料型態 Attributes介面-2 Attributes介面的屬性 Attributes介面的屬性,如下表所示: 屬性 length 說明 取得元素擁有的屬性數 Locator介面 Locator介面提供目前剖析的位置資訊,主 要為下列兩個屬性,如下表所示: 屬性 columnNumber lineNumber 說明 取得所在列 取得所在行