第6回 2007年6月1日 応用Java (Java/XML).

Slides:



Advertisements
Similar presentations
独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
Advertisements

応用 Java(Java/XML) 第1回 2006 年4月 14 日. 講義内容 (4/14) なぜ Java が重要なのか? なぜ XML が重要なのか? Java と XML の関係 パーサの概念 XML 関連のパッケージについて ファクトリのデザインパターン.
Web サービス II ( 第 13 回 )‏ 2008 年 1 月 9 日 植田龍男. 本日の目的 Web サービスの歴史と将来の展望 (1) WSDL 2.0 の登場 ‏ Jersey プロジェクト Ver 0.5 による開発.
プログラミング第5回 1 while ループ 文字列の操作
ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
WebサービスII (第12回)‏ 2007年12月19日 植田龍男.
社会人学習講座 「Javaプログラミング概論」
第9回 2007年6月22日 応用Java (Java/XML).
2006年11月15日 植田龍男 Webサービス II (第8回) 年11月15日 植田龍男.
2006年11月22日 植田龍男 Webサービス II (第9回) 年11月22日 植田龍男.
事前準備 ttsshでのログイン フォルダ名 XML ファイルコピー  cp ~hurry-go-round/Java/XML/* .
Applet 岡部 祐典 鈴木 敬幸.
WebサービスII (第10回) 2007年11月28日 植田龍男.
JSFによるWebアプリケーション開発 第11回
Iアプリプログラミング その1  鳥居秀徳.
アルゴリズムとプログラミング (Algorithms and Programming)
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
JAVA.
第5回 2007年5月25日 応用Java (Java/XML).
第4回 2007年5月11日 応用Java (Java/XML).
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
独習Java ・ 10.6  Hashtableクラス ・ 10.7  String Tokenizerクラス  12月12日    小笠原 一恵.
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
WebサービスII (第8回) 2007年11月14日 植田龍男.
社会人学習講座 「Javaプログラミング概論」
第20章 Flyweight ~同じものを共有して無駄をなくす~
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
Bridge Pattern
RMI ソフトウェア特論 第6回 /
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
コンパイラの解析 (2) GCJのデータ構造 - 1.
第12回 2007年7月13日 応用Java (Java/XML).
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
変数のスコープ クラス クラス変数 すべてのメソッドの外側でstaticで定義
ソフトウェア工学 知能情報学部 新田直也.
第10回 2007年6月29日 応用Java (Java/XML).
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
第11回 2007年7月6日 応用Java (Java/XML).
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
第8回 2007年6月15日 応用Java (Java/XML).
暗黙的に型付けされる構造体の Java言語への導入
第3回 2007年4月27日 応用Java (Java/XML).
WebサービスII (第7回) 2007年11月7日 植田龍男.
第7回 2007年6月8日 応用Java (Java/XML).
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
Collection, Generics, Iterator
11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS.
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
第2回 2007年4月20日 応用Java (Java/XML).
第13回 2007年7月20日 応用Java (Java/XML).
パッケージ,アクセス修飾子 2008年4月27日 海谷 治彦.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
応用Java(Java/XML) 第7回 2006年6月16日 植田龍男.
オブジェクト・プログラミング 第8回.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
Annotation EJB 3.0 コース 第3回 2006年8月4日.
オープンソースソフトウェアに対する コーディングパターン分析の適用
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
応用Java(Java/XML) 第8回 2005年6月9日 植田龍男.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
応用Java(Java/XML) 第8回 2005年6月23日 植田龍男.
Presentation transcript:

第6回 2007年6月1日 応用Java (Java/XML)

前回までやったこと 「XMLパーサ」-- Java でXMLを処理 javax.xml.stream パッケージのパーサ イベントの種類の調べる 応用(1) – テーブルの利用 「要素の出現回数を調べる」 応用(2) – フィルタ的な処理 java.util.Map, java.util.Set 応用(3) – MS Office 2007 のファイルを処理する

本日(6/1)の講義内容 javax.xml.stream の処理の再設計 処理内容を複数のクラスに分ける SAX(Simple API for XML)の処理

(復習) パッケージとAPI javax.xml.stream XMLEventReader インタフェース XMLInputFactory クラス javax.xml.stream.events XMLEvent インタフェース サブインタフェース群 StartDocument, EndDocument, StartElement, EndElement, Characters

その他のパーサの利用 javax.xml.parsers パッケージ SAXパーサ、DOMパーサを提供 org.xml.sax パッケージ org.w3c.dom パッケージ

プログラムの基本部分(1) import javax.xml.stream.events.*; XMLEventReaderTest1.java import javax.xml.stream.*; import javax.xml.stream.events.*; import javax.xml.transform.stream.*; public class XMLEventReaderTest1 { public static void main( String[] args ) {

プログラムの基本部分(2) try { StreamSource source = new StreamSource( args[0] ); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLEventReader reader = factory.createXMLEventReader( source );

プログラムの基本部分(3) int count=0; while( reader.hasNext() ) { XMLEvent event = reader.nextEvent(); if( event.isStartElement() ) { ((StartElement).event).getName(); : }

イベントの場合分けの工夫 処理をメソッドに分割する XMLEvent event = reader.nextEvent(); if( event.isStartElement() ) { startElement( (StartElement)event ); } else if( event.isEndElement() ) { endElement( (EndElement)event ); } :

クラスへの分割を考えてみる 文書の入力先とパーサの取得 イベントの場合分けと処理の呼び出し 各イベントごとの処理の内容

設計案1)単純に3クラスに ParserTest – 文書の指定とパーサの取得 EventCase – イベントの場合分けとメソッドの呼び出し EventProc – イベントの処理の内容の記述

文書の指定とパーサ取得 public class ParserTest { public static void main( String[] ) { try { Source s = new StreamSource( name ); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLEventReader reader = factory.createXMLEventReader( s ); EventCase ec = new EventCase(); ec.dispatch( reader );

場合分けのクラス public class EventCase { public void dispatch( XMLEventReader r ); try{ EventProc proc = new EventProc(); while( r.hasNext() ) { XMLEvent event = r.nextEvent(); if( event.isStartElement() ) { proc.startElement(); } :

処理の内容のクラス public class EventProc { public void startElement( StartElement se) { : } public void endElement( EndElement ee ) { public void characters ( Characters ch ) {

もうひと工夫 イベントの場合分けはいつも同じ 表に出なくてもいいのでは? 1つの方法:「クラスの継承」 AbstractEventProcessor クラス イベントの場合分けと呼び出しを記述 EventProcessorクラス 処理の内容の記述 public class EventProcessor extends AbstractEventProcessor {

さらに厳密にする インタフェースの導入 メソッドの名前、型を常に同じに制約 public interface EventProcessorIF { public void startElement( StartElement es); public void endElement( EndElement ee ); public void characters( Characters ch ); : }

継承関係 public abstract class AbstractEventProcessor implements EventProcessorIF { public void process ( XMLEventReader r ) { while( r.hasNext() ) { XMLEvent event = r.nextEvent(); if( event.isStartElement( ) ) { startElement( (StartElement)event) ; } : public abstract void startElement(StartEement se );

SAXによる処理 javax.xml.parsers 最も初期から利用可能だったパーサ 目的、設計は「今回の工夫」と共通

javax.xml.parsers 最も抽象化されたレベル(JAXP) パーサを「取り出す」ための仕組みを提供 SAXParser, SAXParserFactory DocumentBuilder, DocumentBuilderFactory 唯一の手段ではないが、「標準」を提供 パーサの実装に制限は課さない

パーサを取得するパターン(1) SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser parser = spf.newSAXParser(); XMLReader reader =    parser.getXMLReader();

再度 Factory の「パターン」! XMLInputFactory factory = XMLInputFactory.newInstance(); XMLEventReader reader = factory.createXMLEventReader( source ); Factoryクラスはまず自分のインスタンスを作る Factoryのインスタンスから実際に処理を行うインスタンスを得る

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文書として不適切(文法エラー) warning エラーではない不適切な記述