SAX

SAX
10-1 SAXの概要
10-2 Saxプログラミングの基礎
10-3 saxのプログラム例
SAXの概要(1)
•XML文書を利用したり操作するための標準化されたインターフェイス
DOMはXML文書全体をメモ
リにロードする必要がある
SAXはドキュメントを読み込
みながら処理を行う
*SAXは反応が早く、メモリ消費量の少ないプログラムを作成
することが可能
*ネットワークを介してドキュメントを読み込みながら作業がで
きる
SAXの概要(2)
• 実際のプログラミングでは、SAXをサポートするXMLパー
サーを使用
SAX1
Perserオブジェクトを使ってXML文書を解析する
インターフェイスを定義する
SAX2
XMLReaderを使ってXML文書を解析するインター
フェイスを定義する
SAX2拡張ハンドラ(Lexicalhandler、DEClHandler)
Extension インターフェイスを定義する
SAXの利用上の注意点
• イベント処理型プログラミング
SAXはXML文書を読み込みながらイベン
トを発生させ、イベントを処理することでド
キュメントにアクセスしたり操作したりする
イベント処理型のプログラミングが必要
適切でない時
DOMを使用する
• ドキュメントの変更と新規作成
SAXでXML文書やHTML文書を変更した
り生成したりするとき
フィルターのように結果を随時出力する
生成したり変更するドキュメントの内容を
メモリ上に保存するデータ構造を独自に
作る
ドキュメントの生成部分にDOMを利用す
る必要がある
SAXプログラミングの基礎
イベントとイベントハンドラ(1)
ドキュメントを読み込みながら、ドキュメントの開始と終了、要
素(エレメント)の開始と終了、エラーなどのイベントを検出す
し、プログラムに通知する
プログラムでは、処理したいイベントごとにイベントハンドラを作
成して、そのイベントハンドラでイベントを処理する
パーサーのイベントハンドラにはインターフェイスを介してアクセ
スするので、処理したいイベントにアクセスするためのインター
フェイスを実装するクラスを作り、そこにイベントハンドラで実行
したいことをプログラムコードで記述する
主なイベントハンドラ
イベントハンドラ
説明
characters
要素の中のキャラクタデータを受け取ったことを通知する
startDocument
ドキュメントの開始を通知する
startElement
要素の開始を通知する
SAXイベントハンドラのインターフェイス
インターフェイス 機能
contentHandler XML文書の内容にアクセスするためのSAXのメインインター
フェイス
ErrorHandler
エラーイベントを実装するためのインターフェイス
DTDHandler
DTDのイベントを実装するためのインターフェイス
イベントとイベントハンドラ(2)
基本的に必要な作業はこれだけ!!
(SAXでXML文書を読み込んで解析するための通常作業)
•
•
•
•
処理したいイベントのイベントハンドラを記述する
SAXパーサーオブジェクトを作成する
イベントハンドラを登録する
Parse()メソッドを呼び出す
SAXのプログラム例
クラスの定義
XML文書を読み込んだときに発生するSAXのイベントをイベント
ハンドラで処理するために、イベントハンドラを実装するクラスを
最初に作成する必要がある
JavaのDefaultHandlerクラスを拡張してクラスを定義する方法
public class SAXParse extends org.xml.sa.helpers.DefaultHandler
{
// クラスの定義
}
イベントの処理
・ドキュメントを読み込み始めたときのイベントを処理するイベン
トハンドラ
public void startDocument ()
{
System.out.println("Start document");
}
・ドキュメントをすべて読み込み終わったときのイベントを処理す
るイベントハンドラ
public void endDocument ()
{
System.out.println("End document");
}
• 要素を読み込み始めたときのイベントを処理するstartElementイベントハンドラ作成の例
public void startElement (String uri, String name, String
qName, Attributes atts)
{
// 要素を表示する
System.out.print("Start element:uri=" + uri);
System.out.println(" name=" + name + "qName="+qName);
// 属性値の数を取得する
int 1 = atts.getLength();
if (1 > 0)
{
System.out.println(" Attr");
// 各属性を表示する
for (int i=0; i<1; i++)
{
String LocalName = atts.getLocalName(i);
String QName = atts.getQName(i);
String pName = atts.getValue(i);
System.out.print(" LocalName=" + LocalName);
System.out.println(" QName=" + QName + " pName=" +pName);
}
}
}
• キャラクタイベントを抽出するコードの例
public void characters (char ch[], int start, int length)
{
System.out.print("Characters:[");
for (int i = start; i < start + length; i++){
switch (ch[i]) {
case '\n':
System.out.print("\\n");
break;
default:
System.out.print(ch[i]);
break;
}
}
System.out.println("]");
}
XML文書のパース(1)
• イベントハンドラを記述してクラス全体を定義したら、必要に応じ
てイベントハンドラを呼び出してXML文書をパースする例
public void parseXML(String urlString) throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
ParserAdapter pa = new ParserAdapter(sp.getParser());
pa.setContentHandler(this);
pa.parse(urlString);
}
XML文書のパース(2)
import javax.xml.parser.*;
public class SAXparse extends org.xml.sax.helpers.DefaultHandler{
public static void main(String[] args) {
try {
SAXParse us = new SAXParse();
us.parseXML(args[0]);
}
catch (Throwable t) {
t.printStackTrace();
}
}
宿題
• P216~のSAXプログラムのサンプルをやって
みてください