140 likes | 243 Views
SAX. 10-1 SAX の概要 10-2 Sax プログラミングの基礎 10-3 sax のプログラム例. SAX の概要 (1). XML 文書を利用したり操作するための標準化されたインターフェイス. DOM は XML 文書全体をメモ リにロードする必要がある. SAX はドキュメントを読み込 みながら処理を行う. * SAX は反応が早く、メモリ消費量の少ないプログラムを作成 することが可能 *ネットワークを介してドキュメントを読み込みながら作業がで きる. SAX の概要 (2).
E N D
SAX 10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
SAXの概要(1) • XML文書を利用したり操作するための標準化されたインターフェイス DOMはXML文書全体をメモ リにロードする必要がある SAXはドキュメントを読み込 みながら処理を行う *SAXは反応が早く、メモリ消費量の少ないプログラムを作成 することが可能 *ネットワークを介してドキュメントを読み込みながら作業がで きる
SAXの概要(2) • 実際のプログラミングでは、SAXをサポートするXMLパーサーを使用
イベント処理型プログラミング ドキュメントの変更と新規作成 SAXの利用上の注意点 SAXはXML文書を読み込みながらイベン トを発生させ、イベントを処理することでド キュメントにアクセスしたり操作したりする SAXでXML文書やHTML文書を変更した り生成したりするとき フィルターのように結果を随時出力する 生成したり変更するドキュメントの内容を メモリ上に保存するデータ構造を独自に 作る ドキュメントの生成部分にDOMを利用す る必要がある イベント処理型のプログラミングが必要 適切でない時 DOMを使用する
SAXプログラミングの基礎 イベントとイベントハンドラ(1) ドキュメントを読み込みながら、ドキュメントの開始と終了、要素(エレメント)の開始と終了、エラーなどのイベントを検出すし、プログラムに通知する プログラムでは、処理したいイベントごとにイベントハンドラを作 成して、そのイベントハンドラでイベントを処理する パーサーのイベントハンドラにはインターフェイスを介してアクセ スするので、処理したいイベントにアクセスするためのインター フェイスを実装するクラスを作り、そこにイベントハンドラで実行 したいことをプログラムコードで記述する
主なイベントハンドラ SAXイベントハンドラのインターフェイス
イベントとイベントハンドラ(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イベントハンドラ作成の例要素を読み込み始めたときのイベントを処理する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プログラムのサンプルをやってみてください