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