SAX

Simple API for XML（簡稱SAX）是個循序存取XML的解析器API。SAX提供一個機制從XML文件讀取資料。它是除了文档对象模型（DOM）的另外一種流行選擇。

 使用SAX处理XML 
实现SAX了的解析器拥有事件驱动式的API，并像流读取器那样工作。由使用者定义回调函数，解析时，若发生事件的话会被调用。SAX事件包括：

 XML 文字 节点<!-- (Text nodes) -->
 XML 元素 节点<!-- (Element nodes) -->
 XML 处理指令<!-- (Processing Instructions) -->
 XML 注释<!-- (Comments) -->

事件在遇到任一XML特性时触发，以及遇到他们结尾时再次触发。XML属性也作为传给元素事件资料的一部分。

SAX运行时是单向的；解析过的资料无法在不重新开始的情况下再次读取。

 定义 

不像 DOM，对于SAX并沒有「正式的」规格。Java对于SAX的实现被认为是一种规范，在其他语言的实现尝试遵循著该实现的程序，必要時根据语言差异而调整。

 優點 

SAX解析器在某些方面優於DOM風格解析器。SAX解析器的記憶體使用量一般遠低於DOM解析器使用量。DOM解析器在任何處理開始之前，必須把整棵樹放在記憶體，所以DOM解析器的記憶體使用量完全根據輸入資料的大小。相對來說，SAX解析器的記憶體內容，是只基於XML檔案的最大深度（XML樹的最大深度）和單一XML項目上XML屬性儲存的最大資料。這兩個總是比整顆解析樹本身還小。

因為SAX事件驅動的本質，處理文件通常會比DOM風格的解析器快。記憶體存取耗時，所以DOM較大的記憶體使用也是一個效能議題。

因為SAX的本質，從磁碟串流讀取是可行的。無法放入記憶體的XML文件只可能使用SAX解析器（或另外的串流XML解析器）來處理。

 缺點 

SAX事件驅動的模型對於XML解析很有用，但它確實有某些缺點。

某些種類的XML驗證需要存取整份文件。例如，一個DTD IDREF屬性需要文件內有項目使用指定字串當成DTD ID屬性。要在SAX解析器內驗證，必須追蹤每個之前遇過的ID和IDREF屬性，檢查是否有任何相符。更甚者，一個IDREF找不到對應的ID，使用者只會在整份文件都解析完後才發現，若這種連結對於建立有效輸出是重要的，那用在處理整份文件的時間只是浪費。

另外，某些XML處理能簡單的存取文件。舉例來說，XSLT及XPath需要能夠隨時存取已解析的XML樹中的任何節點。
編輯者和瀏覽器同樣也需要能夠隨時顯示，修改和重新驗證XML樹。雖然一開始可能會使用SAX解析器來編輯建構XML樹，但SAX整體上對於以上處理沒有任何優化。

 參見 
 其他XML處理技術 
 文檔對象模型
 XSL Transformations (XSLT)

 System Integrated Automation parser

 支援SAX的解析器及API 
 Xerces
 MSXML
 Crimson XML
 JAXP - Java XML解析API
 LibXML
 AVHTML - 轻量级C++ HTML Parser

 參考 
 David Brownell：SAX2, O'Reilly, ISBN 0-596-00237-8
 W. Scott Means，Michael A. Bodie：The Book of SAX, No Starch Press, ISBN 1-886411-77-8

 外部連結 
 SAX 首頁
 前10大 SAX2 密技

 語言介面：
 Perl
 Python
 Java

Category:XML
Category:应用程序接口