応用Java(Java/XML) 第4回 2005年5月12日 植田龍男 前回までの復習(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..." ); 属性(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 ); } 終了タグの処理 メソッド endDocument() 引数に要素名の文字列 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 などを利用
© Copyright 2024 ExpyDoc