第2回 2007年4月20日 応用Java (Java/XML)
この講義の目的(再確認) JavaのアプリケーションでXMLを処理するには? サーバサイドの開発の基礎 Webサービス エンタープライズ・アプリケーション
本日の講義内容 XMLパーサとは? XMLパーサにはどんなものがあるか? XMLパーサとJava SE 6のパッケージ javax.xml.stream のAPI(その1)
XMLパーサとは? XML文書内の字句を解析 要素、属性などの情報を取り出す (アプリケーションが1文字ずつの処理を行う必要はない) <doc> <title> Java and XML </title> <image source=“jax.png” /> </doc>
XMLパーサの種類と使い方 標準のクラスライブラリで提供 (新しくパーサを設計する必要なし) 複数の種類(標準的な処理パターン) SAX(Simple API for XML) DOM(Document Object Model) javax.xml.streamパッケージ
XML処理用パッケージ(1) JAXPパッケージ(J2SDK 1.4よりcore) SAX(Simple API for XML) と DOM DTD、XML Schema:妥当性の検証 名前空間、XPath, XSLTの処理 javax.xml.parsers javax.xml.transform javax.xml.transform.dom javax.xml.transform.sax javax.xml.transform.stream
XML処理用パッケージ(2) J2SE 5.0 でさらに拡張 XPath, XML Schemaの検証 javax.xml javax.xml.namespace javax.xml.xpath javax.xml.validation javax.xml.datatype
XML処理用パッケージ(3) Java SE 6 でさらにさらに拡張 JAXB, Webサービス、XML電子署名 javax.xml.bind javax.xml.soap javax.xml.stream javax.xml.ws javax.xml.crypto パッケージ数全部で33個も!
本日の講義で用いるのは javax.xml.stream javax.xml.stream.events 次回以降で javax.xml.stream.util SAX, DOM を利用するには javax.xml.parsers
javax.xml.stream のAPI(1) XMLEventReader インタフェース 構文解析を実行(つまりパーサ) java.util.Iterator として扱える =発見した要素などの構成要素の集まり (つまり、処理結果のデータでもある) hasNext()メソッド、 next()メソッド nextEvent()メソッド <doc><title>ABC</title></doc>
javax.xml.stream のAPI(2) XMLInputFactory クラス XMLEventReader のインスタンスを得るための専用のクラス =それ自身は処理を実行するわけではない 会社の「受付係」、「案内係」の役割
Factory の「デザインパターン」 XMLInputFactory factory = XMLInputFactory.newInstance(); XMLEventReader reader = factory.createXMLEventReader( source ); Factoryクラスはまず自分のインスタンスを作る Factoryのインスタンスから実際に処理を行うインスタンスを得る
なぜ Factory のパターンか? 「実装クラス」の実体を隠す(なぜ?) XMLEventReader reader = new XMLEventReader( source ); とはしない XMLEventReader はインタフェース(抽象化) 実装クラスを交換可能 実行環境によって実装クラスが異なる場合にも柔軟に対応
必要なデータの取り出し方 XMLEventReader reader = …..; while( reader.hasNext() ) { XMLEvent event = reader.nextEvent(); System.out.println( event ); } <doc><title>ABC</title></doc>
XMLEvent とその仲間たち XMLEventReader がかかえるデータ javax.xml.stream.events パッケージが提供 XMLEvent が共通のスーパインタフェース StartDocument, EndDocument StartElement, EndElement Characters, Comment Attribute など <doc><title>ABC</title></doc>
XMLEvent の種類の判定 XMLEvent インタフェースに定義された定数 XMLEvent.START_ELEMENT 等 XMLEvent の getEventType() メソッドの返値 使用例) XMLEvent event = reader.nextEvent(); if( event.getEventType() == XMLEvent.START_ELEMENT ) { :
まとめ( javax.xml.stream の処理) XMLInputFactory が自身のデータを作る XMLEventReder が Factoryから得られる その時点で既に処理されたデータと考えて処理できる(=複数のXMLEvent ) hasNext() メソッドと nextEvent()メソッド ループの中で1個ずつイベントを処理 イベントの種類は XMLEvent の定数値で場合分け
2007 年度の開発環境について Linux は ubuntu Linuxの日本語環境は UTF-8 Javaは Java SE 6 (PATHの設定はやり直す必要なし) 講義内容は LMS に http://lms.wakhok.ac.jp/