二、 背景
2.1 XML
2.1.2 XML的處理
XML 文件,如同前面提到的特性,具備跨平台以及利用自訂標籤來達到資料 描述的能力,如果單純以普通文字編輯器開啟 XML 文件,XML 文件本質上是一個 內容包含許多特殊標籤的文字檔。因此,利用 XML 文件的特性來處理資料時,
就必須依賴一些工具的協助,才能從這個單純的文字檔中取出相關的資訊,也 才 能 發 揮 XML 文 件 的 功 能 。 這 類 的 工 具 一 般 稱 為 XML 文 件 的 解 析 器
(Parser),主要有兩種介面,其中一種是由 W3C 所制定的介面(Interface)
規格開發而成的文件物件模型(Document Object Model,DOM)[6],另一種稱 為簡單 XML 應用程式介面(Simple API for XML,SAX)[7]。SAX 和 DOM 兩者都 提供程式設計師處理 XML 文件資訊。以下將就這兩個主要的文件處理介面提出 說明。
2.1.2.1 文件物件模型(Document Object Model,DOM)
圖3 表示 XML 文件、剖析器、DOM 物件樹和應用程式之間的關係。從圖中我 們可以清楚的看到XML 文件經由剖析器(Parser)剖析之後,形成一個 DOM 樹狀結構,如圖 2,此一樹狀結構將文件中的元素、屬性、資料...等以階層式節 點方式加以儲存,應用程式則藉由存取樹中的節點而讀出資料或寫入資料。
圖 3 DOM 介面運作模式
資料來源:http://msdn.Microsoft.com 使用 DOM 的優點如下:
z 可以任意擷取節點資訊 z 做 XSL 轉換比較容易 缺點如下:
z 需要額外記憶體,不利於大文件的解析
z 處理速度較慢,因為要預先在記憶體建構解析樹
2.1.2.2 簡單 XML 應用程式介面(Simple API for XML,SAX)
SAX 的全名是 Simple API for XML,不像 DOM 是 W3C 所制定出來的一個標 準,而是由一個名為 XML-DEV 的非正式團體所發表。SAX 不僅不會在記憶體中特 地根據 XML 文件的元素內容來建立樹狀結構,還可以為應用程式提供最有效率 的資料儲存方式。
圖 4 中以事件為基礎的解析程式會將事件傳送給應用程式。這裡的事件和 使用者介面所產生的事件(如視窗程式中按鈕的 onClick 事件)很類似。事件 的功用是通知應用程式發生了某些狀況,應用程式則必須加以回應。在瀏覽器 中,事件通常是為了回應使用者的動作而產生的,例如當使用者按下按鈕時,
就會引發 ONCLICK 事件。
圖 4 SAX 介面運作模式
資料來源:http://msdn.Microsoft.com
但在處理 XML 解析程式時,事件和使用者介面無關,而是與從 XML 文件中 讀取的元素有關。在此會出現的幾個主要事件包括:
文件的起始(startDocument())
文件的結束(endDocument())
元素的起始標記(startElement())
元素的結尾標記(endElement())
元素內容(characters())
解析錯誤(warning(),error()及 fatalError())
圖 5 所示為 SAX 解析程式的事件觸發順序。
當解析程式每遇到一個元素節點就會觸發一次 startElement(),所以圖 5 中遇到 school 節點時,觸發 startElement()事件。同樣地接下來的 student,
name 以及 fname 都跟 school 一樣,觸發 startElement()事件,直到 John 這個 Text 節點,解析程式會觸發 characters()事件,然後接下來 fname 以及 lname 兩個結束標籤,解析程式會依序觸發兩次 endElement()事件。如此週而復始在 整 個 文 件 中 , 不 斷 觸 發 一 系 列 的 startElement() , endElement() 以 及 charactres(),直到文件結束最後會觸發唯一的事件 endDocument()為整個解析 過程的結束。
圖 5 SAX 解析程式的事件觸發順序 使用 SAX 的優點如下:
z 速度快
z 不需額外的記憶體,可以處理較大檔案 缺點如下:
z 無法隨意取得節點資訊
z 需要額外的物件維持解析過程中的節點資訊
基於以上優點本論文採用 SAX 解析程式,做為 XML 文件編碼過程的主要工 具。