10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
XML文書を利用したり操作するための標準化されたインターフェイス SAXの概要(1) XML文書を利用したり操作するための標準化されたインターフェイス DOMはXML文書全体をメモ リにロードする必要がある SAXはドキュメントを読み込 みながら処理を行う *SAXは反応が早く、メモリ消費量の少ないプログラムを作成 することが可能 *ネットワークを介してドキュメントを読み込みながら作業がで きる
SAXの概要(2) 実際のプログラミングでは、SAXをサポートするXMLパーサーを使用 SAX1 Perserオブジェクトを使ってXML文書を解析する インターフェイスを定義する SAX2 XMLReaderを使ってXML文書を解析するインターフェイスを定義する SAX2- Extension 拡張ハンドラ(Lexicalhandler、DEClHandler)
SAXの利用上の注意点 イベント処理型プログラミング ドキュメントの変更と新規作成 SAXでXML文書やHTML文書を変更した トを発生させ、イベントを処理することでド キュメントにアクセスしたり操作したりする SAXでXML文書やHTML文書を変更した り生成したりするとき フィルターのように結果を随時出力する 生成したり変更するドキュメントの内容を メモリ上に保存するデータ構造を独自に 作る ドキュメントの生成部分にDOMを利用す る必要がある イベント処理型のプログラミングが必要 適切でない時 DOMを使用する
SAXプログラミングの基礎 イベントとイベントハンドラ(1) ドキュメントを読み込みながら、ドキュメントの開始と終了、要素(エレメント)の開始と終了、エラーなどのイベントを検出すし、プログラムに通知する プログラムでは、処理したいイベントごとにイベントハンドラを作 成して、そのイベントハンドラでイベントを処理する パーサーのイベントハンドラにはインターフェイスを介してアクセ スするので、処理したいイベントにアクセスするためのインター フェイスを実装するクラスを作り、そこにイベントハンドラで実行 したいことをプログラムコードで記述する
SAXイベントハンドラのインターフェイス 主なイベントハンドラ イベントハンドラ 説明 characters 要素の中のキャラクタデータを受け取ったことを通知する startDocument ドキュメントの開始を通知する startElement 要素の開始を通知する SAXイベントハンドラのインターフェイス インターフェイス 機能 contentHandler XML文書の内容にアクセスするためのSAXのメインインターフェイス ErrorHandler エラーイベントを実装するためのインターフェイス DTDHandler DTDのイベントを実装するためのインターフェイス
イベントとイベントハンドラ(2) 基本的に必要な作業はこれだけ!! (SAXでXML文書を読み込んで解析するための通常作業) 基本的に必要な作業はこれだけ!! (SAXでXML文書を読み込んで解析するための通常作業) 処理したいイベントのイベントハンドラを記述する SAXパーサーオブジェクトを作成する イベントハンドラを登録する Parse()メソッドを呼び出す
JavaのDefaultHandlerクラスを拡張してクラスを定義する方法 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]); } 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プログラムのサンプルをやってみてください