SAX Parser
2003 年 3 月
讀取和操縱 XML 文件的標準方法是 DOM(“文檔對象模型”)。遺憾的是,這種方法需要讀取整個文件并將它存儲到樹結構中,因而效率不高、緩慢,并且會過度使用資源。
什么是 SAX
讀取和操縱 XML 文件的標準方法是 DOM(“文檔對象模型”)。遺憾的是,這種方法需要讀取整個文件并將它存儲到樹結構中,因而效率不高、緩慢,并且會過度使用資源。
一種替代方法是使用 Simple API for XML 或 SAX。SAX 允許正在讀取文檔時處理該文檔,這避免了在采取操作之前需要等待存儲文檔的所有內容。
SAX 是由 XML-DEV 郵件列表的成員開發的,Java 版本由 David Megginson 維護。他們的目的是提供一種更自然的方法來使用 XML,這種方法不會涉及到使用 DOM 的那種開銷。
結果是基于事件的 API。解析器將事件(譬如,元素的開始或結束)發送給處理信息的事件處理程序。然后,應用程序自己可以處理數據。雖然原始文檔保持不變,但 SAX 提供了操縱數據的方法,然后會將該方法導向另一個過程或文檔。
對于 SAX,沒有官方的標準;萬維網(W3C)或其它官方組織不維護 SAX,但在 XML 社區中,它是一個事實上的標準。
SAX 處理是如何工作的
SAX 分析經過其的 XML 流,這非常象老式的自動收報機紙條??紤]以下 XML 代碼片斷:
|
一般情況下,SAX 處理器分析這段代碼將生成以下事件:
|
SAX API 允許開發者捕獲這些事件,并對它們進行操作。
SAX 處理涉及以下幾步:
- 創建事件處理程序。
- 創建 SAX 解析器。
- 將事件處理程序分配給解析器。
- 對文檔進行解析,將每個事件發送給處理程序。
在SAX與DOM之間,如何選擇
選擇 DOM 還是 SAX,這取決于幾個因素:
- 應用程序的目的:如果必須對數據進行更改,并且作為 XML 將它輸出,則在大多數情況下,使用 DOM。與使用 XSL 轉換來完成的簡單結構更改不一樣,如果是對數據本身進行更改,則尤其應該使用 DOM。
- 數據的數量:對于大文件,SAX 是更好的選擇。
- 將如何使用數據:如果實際上只使用一小部分數據,則使用 SAX 將數據抽取到應用程序中,這種方法更好些。另一方面,如果知道將需要向后引用已經處理過的信息,則 SAX 可能不是正確的選擇。
- 需要速度:通常,SAX 實現比 DOM 實現快。
記住 SAX 和 DOM 不是互斥的,這一點很重要??梢允褂?DOM 來創建事件的 SAX 流,可以使用 SAX 來創建 DOM 樹。事實上,大多數解析器實際常常使用 SAX 來創建 DOM 樹!
使用 JAXP 來創建解析器
接下來我們來看一下JAXP的SAX Parser是怎么樣工作的。
首先聲明 XMLReader xmlReader。然后使用 SAXParserFactory 來創建 SAXParser。正是 SAXParser 給您了 XMLReader。
|
設置內容處理程序
一旦創建了解析器,則需要將 SurveyReader 設置為內容處理程序,以便于其接收事件。
xmlReader 的 setContentHandler() 方法完成這項工作。
|
當然,對于內容處理程序,這不是唯一的選項。
解析 InputSource
為了對文件進行實際地解析,需要 InputSource。這個 SAX 類封裝了所有將要處理的數據,所以不必擔心它來自哪里。
現在,準備對文件進行實際解析。應用程序將封裝在 InputSource 中的文件傳遞給 parse(),然后應用程序會繼續運行。
|
可以編譯和運行該程序,但這時應該什么也沒有發生,因為應用程序還沒有定義任何事件。
創建 ErrorHandler
當然總會有可能在試圖進行解析時,數據有問題。在這樣的情況下,有一個處理程序來處理錯誤和內容將是有幫助的。
就如同創建內容處理程序一樣,可以創建出錯處理程序。通常,將作為 ErrorHandler 的單獨實例來創建它,但為了簡化該示例,出錯處理正是包含在 SurveyResults 中。由于該類繼承了 DefaultHandler 且沒有擴展 ContentHandler,所以這種雙重用法是可能的。
需要關注的事件有三個:警告、錯誤和致命錯誤。
|
SAX 事件
以下事件是常用的;它們都在 org.xml.sax 包的 HandlerBase 類中定義。
- startDocument 表示文檔開始。
- endDocument 表示文檔結束。
- startElement 表示元素開始。當一對標記中的起始標記中的所有內容被處理后,解析器 激發此事件。包括了標記名和其屬性。
- endElement 表示元素結束。
- characters 包含字符數據,類似于 DOM 的一個 Text 節點。
還有更多的 SAX 事件:
- ignorableWhitespace 此事件類似于我們前面所討論的無用 DOM 節點。它與 character 事件的區別,好處是:如果您不需要空格符,您可以通過忽略這個事件來忽略所有的空格符。
- warning、error 和 fatalError 這三個事件表示了解析錯誤。您可根據需要來響應它們。
- setDocumentLocator 這個事件允許您存儲一個 SAX 的 Locator 對象。Locator 對象可以用來找出在文檔中確切發生事件的地方。
轉自:http://www-128.ibm.com/developerworks/cn/xml/x-cert/part8/
posted on 2005-04-24 10:04 weidagang2046 閱讀(4303) 評論(0) 編輯 收藏 所屬分類: XML