SAXの処理の応用

応用Java(Java/XML) 第3回
2006年4月28日
植田龍男
前回までの復習(SAXによる処
理)



Java で XML文書を処理する
パーサの存在
XML文書を読み込み解釈する
標準の規格に基づき開発
既に実装されたものが多数存在
com.sun.org.apache.xerces…SAXParser
実装クラスは表に出ない工夫
SAXとは?





Simple API for XML
文書を読み込みながら処理
特定のものが見つかるとイベント
ContentHandler
イベント処理の内容を記述
ErrorHandler
エラーが発生した時の処理を記述
パーサを取得するパターン
SAXParserFactory spf =
SAXParserFactory.newInstance();
SAXParser parser =
spf.newSAXParser();
XMLReader reader =
parser.getXMLReader();
org.xml.sax



XMLReader
実際に文書を処理する
parse() メソッド
InputSource
文書の元を指定(ファイル、URLなど)
Attributes
属性の集まり
XMLReaderへのHandlerの登録
XMLReader reader =
parser.getXMLReader();
reader.setContentHandler(
new MyContentHandler() );
reader.setErrorHandler(
new MyErrorHandler() );
その後で、パーシングを開始
XMLReader reader ….
:
InputSource source =
new InputSource( “sample.xml” );
reader.parse( source );
SAXの処理の特徴
XML文書の読み込みと処理が並行に進行
 要素(タグ)ごとに逐次処理
 読み込みと処理は同時に終了
(後処理には別の機構が必要)

ContentHandler の主要な仕事





startDocument() – パーシングの開始時
endDocument() – パーシングの終了時
startElement() – 要素(タグ)の開始
endElement() – 要素(タグ)の終了
characters() – 平文テキストの読み込み
ContentHandler の実例
import org.xml.sax.*;
import java.util.*;
public class MyContentHandler
implements ContentHandler {
public void startDocument()
throws SAXException {
System.out.println( "Now, Start parsing..." );
System.out.println( "---------------------------" );
}
属性(Attribute)の処理
XML文書の属性(Attribute)
<image width=“128” height=“64”>
</image>
 要素の開始タグ内に記述
 属性名と属性値のペア(=で結ぶ)
 属性の個数と順序は自由

本日のテーマ:SAX処理の応用



どんな要素が何個あるか調べたい
特定の要素や属性の値を知りたい
要素や属性の値に応じて適切な処理を行
いたい
開始タグの処理 startElement()
ContentHandler の startElement()で処理
 引数に org.xml.sax.Attributes の値
public void startElement( String, String,
String, Attributes ) {
 その要素の開始タグ内で指定された属性
と属性値の情報すべて

属性の処理の手順

Attributes のインスタンスから個々の属性
の情報を取り出す
for( int i=0; i<attrs.getLength(); i++ ) {
String qName = attrs.getQName( i );
String value = attrs.getValue( qName );
}
終了タグの処理


メソッド endElement()
引数に要素名の文字列
public void endElement( String, String,
String ) {
ドキュメントの処理の開始時


メソッド startDocument()
開始時に呼び出される
(開始の命令ではない)
準備の処理を記述
例)テーブル生成や初期化など
ドキュメントの処理の終了時


メソッド endDocument()
終了時に呼び出される
(終了の命令ではない)
最終結果の処理を記述
例)テーブルに格納したデータの表示
java.util.HashMap クラス



「キー」と「値」のペアを複数集めた表
table.put( key, value );
value = table.get( key );
Javaの新機能:キーと値の型を指定できる
HashMap<String, Integer> table
= new HashMap<String, Integer>();

フィルタ的な処理の実現



特定の要素や属性の情報のみを取り出す
要素名や属性名を変更する
startElement(), endElement() で逐次
チェックを実行
まとめ




SAXの処理は、各要素や属性のその場で
の処理に向いている(フィルタ的な処理)
準備の処理は startDocument()
結果の処理は endDocument()
複数の要素が関係する処理の場合には、
関係をアプリケーションが記憶する
HashMap などを利用