第5回 2007年5月25日 応用Java (Java/XML).

Slides:



Advertisements
Similar presentations
プログラミング第5回 1 while ループ 文字列の操作
Advertisements

応用 Java(Java/XML) 第 10 回 2006 年 7 月 14 日 植田龍男. 後半の内容の予定 XPath (6/9) 、 XSLT (6/16) 名前空間 (Namespace) (6/16) XML 文書の妥当性の検証 (6/23) DTD, W3C XML Schema SOAP.
WebサービスII (第12回)‏ 2007年12月19日 植田龍男.
第9回 2007年6月22日 応用Java (Java/XML).
2006年11月15日 植田龍男 Webサービス II (第8回) 年11月15日 植田龍男.
東京工科大学 コンピュータサイエンス学部 亀田弘之
Java I 第2回 (4/18)
Applet 岡部 祐典 鈴木 敬幸.
背景 我々の研究室で開発しているJavaプログラム解析フレ ームワークでは,解析情報はメモリ上に保持される 問題点
~手続き指向からオブジェクト指向へ(Ⅰ)~
WebサービスII (第10回) 2007年11月28日 植田龍男.
JSFによるWebアプリケーション開発 第11回
Servlet J2EE I 第8回 /
Iアプリプログラミング その1  鳥居秀徳.
アルゴリズムとプログラミング (Algorithms and Programming)
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
プログラミング基礎I(再) 山元進.
第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日 植田龍男.
繰り返し プログラミング 第4回 繰り返し プログラミング第4回.
JSFによるWebアプリケーション開発 第6回
第20章 Flyweight ~同じものを共有して無駄をなくす~
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
アルゴリズムとデータ構造 2011年6月20日
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
~手続き指向からオブジェクト指向へ[Ⅱ]~
第12回 2007年7月13日 応用Java (Java/XML).
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
第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).
第6回 2007年6月1日 応用Java (Java/XML).
EclipseでWekaのAPIを呼び出す
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
Collection, Generics, Iterator
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
Jakarta Struts (2) ソフトウェア特論 第11回.
第2回 2007年4月20日 応用Java (Java/XML).
XMLゼミ 1.3 XML文書の表示 1.4 XMLの役割 1.5 XMLとプログラミング M2 正木 裕一.
独習XML ~第3章 文書と構造~ 3.3 スキーマ 3.3 XML Schema
2006年11月8日 植田龍男 Webサービス II (第7回) 年11月8日 植田龍男.
アルゴリズムとデータ構造1 2005年7月5日
第13回 2007年7月20日 応用Java (Java/XML).
ソフトウェア制作論 平成30年11月21日.
パッケージ,アクセス修飾子 2008年4月27日 海谷 治彦.
応用Java(Java/XML) 第7回 2006年6月16日 植田龍男.
アルゴリズムとプログラミング (Algorithms and Programming)
アルゴリズムとデータ構造1 2006年7月4日
JAVA入門③ 配列とコレクション.
独習XML ~第1章 XMLの基礎~ 1.1 XML文書の基礎 1.2 XMLとHTML
コレクション・フレームワーク J2EE I (データベース論) 第6回 /
コレクション・フレームワーク データベース論 第7回.
オープンソースソフトウェアに対する コーディングパターン分析の適用
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
JAVA入門⑥ クラスとインスタンス.
アルゴリズムとデータ構造 2012年6月21日
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
アルゴリズムとデータ構造1 2005年7月12日
応用Java(Java/XML) 第8回 2005年6月9日 植田龍男.
応用Java(Java/XML) 第8回 2005年6月23日 植田龍男.
Presentation transcript:

第5回 2007年5月25日 応用Java (Java/XML)

前回までやったこと 「XMLパーサ」-- Java でXMLを処理 javax.xml.stream パッケージのパーサ イベントの種類の調べる 空白文字のチェック 属性の処理 応用(1) – テーブルの利用 「要素の出現回数を調べる」 java.util.Map, java.util.Set

本日(5/25)の講義内容 javax.xml.stream の処理の応用(2) フィルタ的な処理 MS Office 2007 のXMLを解析する java.util.Collection のフレームワーク Set, HashSet, SortedSet Map, HashMap, TreeMap

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

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のインスタンスから実際に処理を行うインスタンスを得る

必要なデータの取り出し方 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>

プログラムの基本部分(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(); System.out.println( "Event " + count + ":" + event ); count++; }

処理対象のXML文書の例 sample1.xml <document> <title>Java and XML</title> Let's begin, now! </document>

実行結果 Event 0: <?xml version=“1.0” encoding=“UTF-8” ?> Event 1: <document> Event 2: Event 3:<title> Event 4: Java and XML Event 5: </title> Event 6: Let’s begin, new! Event 7: </document> Event 8: ENDDCUMENT

XMLEventの種類の判定 XMLEvent に定義されたメソッド isStartElement() など boolean型の返り値 if( event.isStartDocument() ) { return "Start Document”; } else if( event.isEndDocument() ) { return "End Document"; :

各イベントごとのメソッド StartDocument sdevent; String version = sdevent.getVersion(); return "Start Document:version=" + version; if( event.isStartDocument() ) { String version = ((StartDocument)event).getVersion(); }

各イベントごとのメソッド(2) Characters テキストの内容 getData() 改行・空白のみかの判定 isWhiteSpace() if( event.isCharacters() ) { String data=""; if( ((Characters)event).isWhiteSpace() ) data = "White Space"; else data = ((Characters)event).getData(); return "Text:" + data;

各イベントごとのメソッド(3) StartElement 要素の名前 getName() 開始タグ内の属性リスト getAttributes() 属性を持つ要素の例 <image source="java.png" height="400" > </image>

前回の例:要素ごとの数(1) 後で必要になる情報を記憶する(テーブルに) 複数のデータを記憶 java.util.Collection, java.util.List, java.util.Set 複数のペアのデータの表 java.util.Map (キーと値、キー全体は Set ) キー <document> <tytle> <image> <text> 値 1 2 4

前回の例:要素ごとの数(2) 変数ではなく Mapを用意 Map<String,Integer> map = new HashMap<String,Integer>(); while( reader.hasNext() ) { XMLEvent event = reader.nextEvent(); if( event.isStartElement() ) { String name = ((StartElement)event) .getName().toString(); saveToTable( name, map ); }

前回の例:要素ごとの数(3) Mapへの格納方法 // 既に格納されている時ー 値を1増やす // 既に格納されている時ー 値を1増やす if( map.containsKey( name ) ) { Integer i = map.get( name ); map.put( name, new Integer( i+1 ) ); } // 格納されていないー新たに値1で格納 else { map.put( name, new Integer( 1 ) );

前回の例:要素ごとの数(4) Mapに記憶された値の利用 Set<String> keys = map.keySet(); Iterator<String> it = keys.iterator(); while( it.hasNext() ) { String key = it.next(); Integer value = map.get( key ); System.out.println( key + "=" + value ); }

補足:拡張 forループの利用 Collection の処理を簡潔に記述 Set<String> keys = map.keySet(); for( String key : keys ) { Integer value = map.get( key ); System.out.println( key + "=" + value ); } カウンタ変数、Iterator は表に出ない

フィルタ的な処理の実現 「フィルタ」とは? 与えられた入力内容を変換して出力 入力=>[処理内容]=>出力 例: 一部分の取り出し 並べ替え 特定のパターンの検出 特定のパターンの変換

今回の目的(1) 平文のテキスト部分を取り出す 特定の名前の要素を取り出す 特定の名前の要素名を変換する

平文テキストの取り出し Characters のイベントを処理 getData()メソッドで内容を取り出す if( event.isCharacters() ) { Characters chars = (Characters)event; if( !chars.isWhiteSpace() ) { String text = chars.getData(); System.out.println( text ); }

特定の名前の要素を取り出す(1) 対象はあらかじめテーブルに記憶 Map<String,String> map = new TreeMap<String,String>(); map.put( "document" , "body" ); map.put( "title" , "h1" ); map.put( ":text" , "p" );

特定の名前の要素を取り出す(2) startElement, endElementを処理 getName() メソッドでチェック StartElement se; String name = se.getName().toString(); if( map.containsKey( name ) ) { String value = map.get( name ); System.out.println( "<" + value + ">" ); }

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

補足2)「名前空間」 要素などの名前の衝突を避ける工夫 「名前空間(Namespace)」=「住所」 URN,URI で表現 xmlns:ns=http://w3.org/Namespace 「省略形」として「プレフィックス」 xmlns:v="urn:schemas-microsoftcom:vml" : <v:ab> abcd </v:ab>

補足3)QName javax.namespace.Qname クラス 正式なURIを含む情報を定められた形式で記憶 getLocalPart() -- 名前空間を含まない部分の名前 getPrefix() – 文書内のプレフィックスの名前

さらに応用) MS Office のXML MicroSoft Office 2007 からファイルの保存形式の標準は XML 複数の XMLを ZIP形式で保存 word -+- document.xml +- fontTable.xml +- settings.xml +- styles.xml +- WebSettings.xml

補足) ZIP と Jar コマンド Jar ( Java Archive ) ファイルの保存形式はZIPを採用 t オプション – 内容を調べる x オプション – 実際に展開 使用例) jar tvf Java.docx jar xvf Java.docx

補足) java.util.zipパッケージ ZIP形式のファイルを直接処理する ZipFile クラス – ZIP形式のファイル ZipEntry クラス – 格納された個々のファイルやディレクトリ ZipEntry の集まりは java.util.Enumeration (古いスタイルだが、取り扱いは java.util.Iterator とほぼ同じ)