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
說明
取得所在列
取得所在行