Transcript パーサとSAXの処理
応用Java(Java/XML) 第2回 2006年4月21日 植田龍男 JavaでXMLを処理するには? XMLはテキストファイル =>独自に文字単位で処理は可能 XMLは独自の文法を持つ 要素(タグ)と属性(名前と値のペア) < > </> = XML文書は設計に基づく構造を持つ *自前で処理は煩雑、誰がやっても同じ =>専用のパッケージ(API)があれば・・・ XML文書の処理 XMLパーサ(parser)の概念 パーサの規格(SAX,DOM、他) Javaによるパーサの実現 Sunによる参照実装 Apacheプロジェクト ( http://xml.apache.org/ ) JAXPの発想 多数のパーサの実装を統合する枠組み JAXP自体は構文解析を行うわけではない パーサはJAXPとは独立できる パーサの実装に非依存なアプリケーション 実現のために抽象化されたクラス群を定 義 J2SE 1.4以降のAPI javax.xml.parsers org.xml.sax org.w3c.dom javax.xml.transform javax.xml.parsers 最も抽象化されたレベル(JAXP) パーサを「取り出す」ための仕組みを提供 SAXParser, SAXParserFactory DocumentBuilder, DocumentBuilderFactory 唯一の手段ではないが、「標準」を提供 パーサの実装に制限は課さない パーサを取得するパターン(1) SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser parser = spf.newSAXParser(); XMLReader reader = parser.getXMLReader(); org.xml.sax SAX(Simple API for XML) サブパッケージ org.xml.sax.ext org.xml.sax.helpers XMLパーサのいろいろ Sun の実装参照 Apache の Crimson (J2SE 1.4) Apahce の Xerces (J2SE 5.0 ) SAXによる処理 SAX(=Simple API for XML ) SAX の仕組み(イベント駆動型処理) ContentHandler ErrorHandler JAXP による SAXパーサの取得 SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser parser = spf.newSAXParser(); XMLreader reader = parser.getXMLReader(); SAXの処理の特徴 XML文書を読み込みながら処理 特定の「節目」でイベントが発生 (イベント駆動型の処理) イベントの処理はHandlerが担当 ContentHandler(のサブクラス) ErrorHandler(のサブクラス) 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 その他の機能 名前空間の処理 妥当性の検証とWhite Spaceの処理 *以上は次回以降に利用 ErrorHandlerの仕事 3つのエラーレベル fatalError 文書名の間違い、不存在 XML文書として不適切(文法エラー) error XML文書の設計に不適合(非妥当性) warning エラーではない不適切な記述