14
SAX 10-1 SAX ののの 10-2 Sax のののののののののの 10-3 sax ののののののの

SAX

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

Page 1: SAX

SAX

10-1 SAX の概要10-2 Sax プログラミングの基礎10-3 sax のプログラム例

Page 2: SAX

SAX の概要 (1)•XML 文書を利用したり操作するための標準化されたインターフェイス

DOM は XML 文書全体をメモリにロードする必要がある

SAX はドキュメントを読み込みながら処理を行う

* SAX は反応が早く、メモリ消費量の少ないプログラムを作成 することが可能*ネットワークを介してドキュメントを読み込みながら作業がで きる

Page 3: SAX

SAX の概要 (2)

• 実際のプログラミングでは、 SAX をサポートする XMLパーサーを使用

SAX1 Perserオブジェクトを使って XML文書を解析するインターフェイスを定義する

SAX2 XMLReaderを使って XML文書を解析するインターフェイスを定義する

SAX2-

Extension

拡張ハンドラ (Lexicalhandler、 DEClHandler)

インターフェイスを定義する

Page 4: SAX

SAX の利用上の注意点• イベント処理型プログラミン

グ• ドキュメントの変更と新規作

SAX は XML 文書を読み込みながらイベントを発生させ、イベントを処理することでドキュメントにアクセスしたり操作したりする

イベント処理型のプログラミングが必要

適切でない時

DOM を使用する

SAX で XML 文書や HTML 文書を変更したり生成したりするとき

フィルターのように結果を随時出力する

生成したり変更するドキュメントの内容をメモリ上に保存するデータ構造を独自に作る

ドキュメントの生成部分に DOMを利用する必要がある

Page 5: SAX

SAX プログラミングの基礎        イベントとイベントハ

ンドラ (1) ドキュメントを読み込みながら、ドキュメントの開始と終了、要素(エレメント)の開始と終了、エラーなどのイベントを検出すし、プログラムに通知する

 プログラムでは、処理したいイベントごとにイベントハンドラを作成して、そのイベントハンドラでイベントを処理する

パーサーのイベントハンドラにはインターフェイスを介してアクセスするので、処理したいイベントにアクセスするためのインターフェイスを実装するクラスを作り、そこにイベントハンドラで実行したいことをプログラムコードで記述する

Page 6: SAX

イベントハンドラ

説明

characters 要素の中のキャラクタデータを受け取ったことを通知する

startDocument ドキュメントの開始を通知するstartElement 要素の開始を通知する

主なイベントハンドラ

インターフェイス

機能

contentHandler XML 文書の内容にアクセスするための SAX のメインインターフェイス

ErrorHandler エラーイベントを実装するためのインターフェイスDTDHandler DTD のイベントを実装するためのインターフェイス

SAX イベントハンドラのインターフェイス

Page 7: SAX

イベントとイベントハンドラ (2)

      基本的に必要な作業はこれだけ!!  (SAX で XML 文書を読み込んで解析するための通常作

業 )

• 処理したいイベントのイベントハンドラを記述する• SAX パーサーオブジェクトを作成する• イベントハンドラを登録する• Parse() メソッドを呼び出す

     

Page 8: SAX

SAX のプログラム例

 クラスの定義

XML 文書を読み込んだときに発生する SAX のイベントをイベントハンドラで処理するために、イベントハンドラを実装するクラスを最初に作成する必要がある

Javaの DefaultHandlerクラスを拡張してクラスを定義する方法

public class SAXParse extends org.xml.sa.helpers.DefaultHandler{ // クラスの定義}

Page 9: SAX

イベントの処理・ドキュメントを読み込み始めたときのイベントを処理するイベントハンドラ

public void startDocument () { System.out.println("Start document"); }・ドキュメントをすべて読み込み終わったときのイベントを処理するイベントハンドラ

public void endDocument () { System.out.println("End document"); }

Page 10: SAX

• 要素を読み込み始めたときのイベントを処理する 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); } }}

Page 11: SAX

• キャラクタイベントを抽出するコードの例 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("]");}

Page 12: SAX

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);

}

Page 13: SAX

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();

}

}

Page 14: SAX

宿題• P216~ の SAX プログラムのサンプルをや

ってみてください