Simple API for XML

Simple API for XML（SAX、サックス）とは、XML文書をアプリケーションソフトウェアから利用するためのAPI。

概要 

DOM API が、W3Cから勧告されたのに対して、SAX API は、XML-DEVメーリングリスト有志により策定された。そして、DOMに並ぶ標準規格としての地位を固めている。

XML文書を木構造として扱うDOMと異なり、一連のイベントとして表現するイベント駆動型のAPIである。したがって、アプリケーションソフトウェアが積極的にAPIにアクセスするDOMに対し、SAXではアプリケーションソフトウェアがイベントが来るのを待ち受ける受動的な動作が大部分を占める。

伝統的なストリームと同様に入力されたデータを次々とバトンタッチさせるような設計が可能となるため、メモリを節約でき、並列処理にも適している。XMLを読み込み、Javaのオブジェクトに変換するときはSAXの方がよく使われる。ただし、XML文書の先頭と最後を入れ替えるというようなランダムアクセスを必要とするアプリケーションソフトウェアにはDOMやXMLデータベースの方が適している。

Apache Cocoon のようなスケーラビリティの高い優れたSAXアプリケーションソフトウェアが開発されている。

使用例 

以下に、プログラミング言語Javaでの使用例を示す。特別:RecentchangesのRSSを読み込み、タイトルの一覧を表示している。

import java.io.IOException;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;

public class Test {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();

        parser.parse("http://ja.wikipedia.org/w/index.php?title=%E7%89%B9%E5%88%A5:Recentchanges&feed=rss", new DefaultHandler() {
            private String text = "";
            private boolean isItemStarted = false;

            public void startElement(String uri, String localName, String qName, Attributes attributes) {
                if(qName.equals("item")) {
                    isItemStarted = true;
                }
            }
            
            public void endElement(String uri, String localName, String qName) {
                if (isItemStarted && qName.equals("title")) {
                    System.out.println(text);
                }
            }

            public void characters(char[] ch, int start, int length) {
                text = new String(ch, start, length);
            }
        });
    }
}

外部リンク 

 SAX

XML
API
構文解析 (プログラミング)