1. SAXの概要
2005.11.08 株式会社四次元データ 宮澤了祐
- 1.1. SAXとは
- 1.2. SAXのインストール
- 1.3. 簡単な例
1.1. SAXとは
SAXとはSimple API For XMLの略で、その名の通りXMLを解析する標準APIの一つです。 DOMとは違って文書を先頭から順に読み込んでいき、そこで発生したイベントを経由して情報をプログラムに伝達します。 DOMの場合はXMLの構造も保存するため、XML文書全体の構文解析が終了し、DOMツリーができるまではプログラムは何の情報も得ることはできませんが、 SAXの場合は解析中に分かったことから順次伝達するため、構文解析の終了まで待たずに処理を開始することができます。 またDOMはXML文書全体をツリー形式で保存するため、巨大なXMLを読み込むためにはそれに応じた大量のメモリが必要となりますが、 順次読み込むSAXでは巨大なXMLファイルでも少ないメモリで対処することが出来ます。 ただしXML文書を更新することは出来ません。
1.2. SAXのインストール
SAXは、DOMと同様にJAXPと一緒に提供されています。 JAXPはJava API for XML Processingの略で、JavaでXML文書を操作するためのAPIです。 JAXPをダウンロードすると、JAXPを実装したXMLパーサも同時にダウンロードされます。 JAXPをインストールすれば、SAXを使用することが出来ます。
J2SEのバージョンが1.4以上であればJAXPが最初から含まれているため、インストールする必要はありません。 1.3より以前のバージョンを使用している場合、JAXPをインストールする必要があります。 JAXPは、SUNが提供する「XMLパック」に含まれています。 SUNのサイト(http://java.sun.com/xml/download.html)より 入手することができます。 入手しましたらXMLパックを解凍し、jaxp-api.jar、dom.jar、sax.jar、xercesImpl.jarのファイルをCLASSPATHに追加します。
1.3. 簡単な例
<?xml version="1.0" encoding="euc_jp" ?> <root> <text>Hello SAX!!!</text> </root>このシンプルなXMLファイルを解析して出力するプログラムを作成します。
import java.io.File; import java.io.IOException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; public class SaxSample extends DefaultHandler{ public static void main(String[] args) throws IOException, ParserConfigurationException, SAXException { SAXParserFactory spfactory = SAXParserFactory.newInstance(); SAXParser parser = spfactory.newSAXParser(); parser.parse(new File("sample.xml"), new SaxSample()); } //start Document public void startDocument() { System.out.println("ドキュメント開始"); } //start Element public void startElement(String uri, String localName, String qName, Attributes attributes) { System.out.println("要素開始:" + qName); } //Text public void characters(char[] ch, int offset, int length) { System.out.println("テキストデータ:" + new String(ch, offset, length)); } //End Element public void endElement(String uri, String localName, String qName) { System.out.println("要素終了:" + qName); } //End of Document public void endDocument(){ System.out.println("ドキュメント終了"); } }ここでは、全てのイベントを実装したorg.xml.sax.helpers.DefaultHandlerを継承してイベントを受け取ります。
- startDocument()
- ドキュメントの開始時に実行されます。
- endDocument()
- ドキュメントの終了時に実行されます。
- startElement()
- エレメントの開始タグ読み込み時に実行さされます。
uri・・・名前空間のURI
localName・・・前置修飾子を含まないローカル名。名前空間処理が行われない場合は空文字列
qName・・・前置修飾子を持つ修飾名。修飾名を使用できない場合は空文字列
attributes・・・指定された属性またはデフォルトの属性
- characters()
- 要素のテキスト部分を読み込んだ際に実行されます。
ch・・・文書のデータが入ったchar型の配列
offset・・・配列の中のテキストの入る位置
length・・・配列の長さ
- endElement
- エレメントの終了タグ読み込み時に実行されます。
uri・・・名前空間のURI
localName・・・前置修飾子を含まないローカル名。名前空間処理が行われない場合は空文字列
qName・・・前置修飾子を持つ修飾名。修飾名を使用できない場合は空文字列
ドキュメント開始 要素開始:root 要素開始:text テキストデータ:Hello SAX!!! 要素終了:text 要素終了:root ドキュメント終了