このページでは、汎用的なデータ記述言語である XML を主に扱います。
XML の基本をおさえつつ、その Web の世界での活用方法についてご紹介します。
お知らせ
- 年内は12月22日(火)で終わりですが、これが発表会前の最後の回となります。
- 1月12日(火)は休講とします。1月19日(火)[補講日] に発表会を行います。
- 授業の動画を WebClass で公開しています。復習に必要でしたらご覧ください。
テキスト
- データとデータ記述
- XMLの基本
- プログラミングの準備
- ストリームとネットワーク接続
- ストリームを用いたファイルの読み込み
- ストリームを用いたWeb上のリソースの取得
- ストリームを用いたデータの送信 [参考]
- 文字列の処理
- XMLの応用例(1) - Feed (RSS/Atom)
- XML文書とDOM
- XMLの応用例(2) - Webサービス
- HTML文書とDOM
- JSON とバインディング
- 参考
最終課題
- 最終課題: 自分の好きなテーマでマッシュアップ
- 複数のリソースから得られる情報を組み合わせて有益な情報を得る
マッシュアップのプログラムを作成しましょう。
- ここでのリソースとは情報資源のことです。Web経由で取得する情報を基本とします。
- 原則として、Webサービスまたはフィード(RSS または Atom)で得られる情報を利用しましょう。
Webページ(HTML文書)を解析しないと得られない情報を使う場合には、
プログラムが煩雑になること、
取得時にサーバに負荷がかからないよう配慮する必要があることに留意してください。
- Web上の資源とローカルの情報を組み合わる場合には、Web上の資源は1つでよいとすることがあります(相談してください)。
ローカルな情報の例: Webブラウザのキャッシュや履歴、iTunes のライブラリのメタ情報、等。
- 複数のリソースをどう組み合わせ、どのような機能を実現するのか、工夫してみてください。
工夫するほど評価が上がります。
- 上記プログラムのレポートを書きましょう。詳細...
- 提出先・提出期限はプログラムと同じです。
- レポートの提出が無かったり、レポートの内容がプログラムと整合していない場合には単位が出ません。
- 提出先: 授業フォルダの「最終課題」
- 提出期限: 1月15日(金) 20:00
昨年度の作品例
- ニコニコ動画でランキングにランクインした動画のTwitterでの人気度を調査
- 旅行の目的地を指定すると、候補の宿とその近隣の飲食店情報を表示
- 複数の動画配信サイトの番組を視聴者数順にソートし、動画をウィンドウに表示
- 季節別TVアニメ主題歌のTSUTAYA在庫情報を照会
- ホットペッパーグルメとぐるなびの両サイトで上位の飲食店を駅名から検索
- Spotifyプレイリストをレーベル、ジャンル、リリース年に分類
- 料理のレシピを検索し、その結果のソート基準をその日の天気により変更
- ニコニコ動画のアニメランキングを、それぞれのアニメのまとめサイトの情報と同時に表示
発表会
1月19日(火)に最終課題の発表会を開催します。
- 発表手順
- 学籍番号と名前を述べる。
- プログラムのタイトルを示し、何をするプログラムなのか概要を説明する。
- デモをする。(できない場合は過去の実行結果を提示)
- プログラムの中で、特にアピールしたい工夫点を述べる。
- 質疑を受ける。
- 発表時間: 発表5分、質疑5分程度を予定。
- 発表者: 立候補優先 + 当日指名。
- 楽しんで作成した人は、ぜひ披露しましょう。
- プログラムの完成度が低くても、
結果が面白そうだと指名されることがあります。
指名されるか否かと成績は必ずしも一致しません。
- 発表会に参加しないと減点になります。
- 評価との関係: 提出物に対する評価点が、発表の内容により見直されます。
発表はアピールポイントに集中して話すことができるため、
レポートよりも成果を認められやすい傾向にあります。
提出物は Box の出題回のフォルダの直下に学籍番号(アルファベットは小文字)のフォルダを作成し、
その中にコピーしてください。
なお、他の人と同じファイルを提出すると 0点以下の点数になります。
SSL に関する例外が発生する場合は、
プロジェクトで使用する JRE (Java の実行環境) を 11 にしてみてください。
- ウィンドウ → 設定 → Java → インストール済みの JRE
11 にチェックを入れ、「適用して閉じる」ボタンを押す
- プロジェクト・エクスプローラーで使用するプロジェクトをクリックして選択
- プロジェクト → 設定 → Javaのビルド・パス → ライブラリー
「JRE システム・ライブラリー」を選択し「編集」ボタンを押す
「ワークスペースのデフォルトの JRE」を選択し「完了」ボタンを押す
「適用して閉じる」ボタンを押す
- 課題12
- 最終課題のリソース取得または抽出した情報の組み合わせ (3)
すでに複数のリソースの取得を終えている人は、それらから得られる情報を組み合わせるプログラムを作成しましょう。
取得するリソースが多いなどの理由でまだすべてのリソースの取得を終えていない人は、引き続きリソースの取得を進めるのでもかまいません。
- プログラムは一体として動作するようにしましょう。
- マッシュアップの機能は作成途中でかまいません。途中経過を提出してください。
- ファイル名: (指定なし)
- 備考: プログラムが動作していない人も、作成途中のものを提出すること。
- プログラムの構想 [更新した人のみ]
プログラムの構想を変更した人は、改訂版のスライドを提出してください。
- ファイル名: システム構想.pptx (PowerPointを使わない人は PDF でも可)
- 提出先: 授業フォルダの第12回
- 提出期限: 次回の前日 18:00
- 課題11
- 最終課題のリソース取得または抽出した情報の組み合わせ (2)
すでに複数のリソースの取得を終えている人は、それらから得られる情報を組み合わせるプログラムを作成しましょう。
取得するリソースが多いなどの理由でまだすべてのリソースの取得を終えていない人は、引き続きリソースの取得を進めるのでもかまいません。
- プログラムは一体として動作するようにしましょう。
- マッシュアップの機能は作成途中でかまいません。途中経過を提出してください。
- ファイル名: (指定なし)
- 備考: プログラムが動作していない人も、作成途中のものを提出すること。
- プログラムの構想 [更新した人のみ]
プログラムの構想を変更した人は、改訂版のスライドを提出してください。
- ファイル名: システム構想.pptx (PowerPointを使わない人は PDF でも可)
- 提出先: 授業フォルダの第11回
- 提出期限: 次回の前日 18:00
- 課題10
- 最終課題のリソース取得または抽出した情報の組み合わせ (1)
すでに複数のリソースの取得を終えている人は、それらから得られる情報を組み合わせるプログラムを作成しましょう。
取得するリソースが多いなどの理由でまだすべてのリソースの取得を終えていない人は、引き続きリソースの取得を進めるのでもかまいません。
- プログラムは一体として動作するようにしましょう。
- マッシュアップの機能は作成途中でかまいません。途中経過を提出してください。
- ファイル名: (指定なし)
- 備考: プログラムが動作していない人も、作成途中のものを提出すること。
- プログラムの構想 [更新した人のみ]
プログラムの構想を変更した人は、改訂版のスライドを提出してください。
- ファイル名: システム構想.pptx (PowerPointを使わない人は PDF でも可)
- 提出先: 授業フォルダの第10回
- 提出期限: 次回の前日 18:00
- 課題9
- 最終課題のリソース取得 (2)
最終課題のプログラムでは複数のリソースを取得することになります。
今回は、前回(課題7)とは異なるリソースを取得するプログラムを作成しましょう。
サーバからのレスポンスを受け取るだけでなく、そこから必要な情報を抽出する部分も考えましょう。
- 前回のプログラムと一体のものとして動作するようにクラス構成を考えましょう。
できない場合は単独で動作するものでもよいことにします。
- 先に進んでいる人は、3つ以上のリソースを取得したり、組み合わせたりするプログラムを提出してもかまいません。
- ファイル名: (指定なし)
- 備考: 動作するに至らなかった人は、作成途中のものを提出すること。
その場合、動かなかった機能をファイル先頭にコメントで記述すること。
- プログラムの構想 [更新した人のみ]
プログラムの構想を変更した人は、改訂版のスライドを提出してください。
- ファイル名: システム構想.pptx (PowerPointを使わない人は PDF でも可)
- 提出先: 授業フォルダの第9回
- 提出期限: 次回の前日 18:00
- 課題8
- プログラムの構想
最終課題のプログラムの構想をスライドにまとめましょう。
以下の内容を含めてください。
- 実現する機能の概要
- 使用するリソースの概要と形式(リソースごとに記述)
- 概要
- 提供元
- ベースURL
- 形式: Webサービス | RSS | Atom | HTML | その他
- システムの概要が分かる図
- システムの入出力と内部のデータの流れがわかるもの。
- 事前にデータを集めておく場合は、それも表現すること。
- ファイル名: システム構想.pptx (PowerPointを使わない人は PDF でも可)
- 備考: 構想は確定ではなく、後での変更も可とします。
- 最終課題のリソース取得 (1) [改善版 - 任意]
最終課題のプログラムでは複数のリソースを取得することになりますが、
まずそのうちの1つを取得するプログラムを作成しましょう。
- ファイル名: (指定なし)
- 備考: 動作するに至らなかった人は、作成途中のものを提出すること。
その場合、動かなかった機能をファイル先頭にコメントで記述すること。
- 提出先: 授業フォルダの第8回
- 提出期限: 次回の前日 18:00
- 課題7
- 最終課題のリソース取得 (1)
最終課題のプログラムでは複数のリソースを取得することになりますが、
まずそのうちの1つを取得するプログラムを作成しましょう。
サーバからのレスポンスを受け取るだけでなく、そこから必要な情報を抽出する部分も考えましょう。
ただし、他のリソースからの情報がないと抽出する情報が定まらない場合には、今回は先送りでかまいません。
- フィード(RSS または Atom)か Webサービスを利用しましょう。
- 将来的には 1つのプログラムで複数のリソースを取得することになりますので、
余力のある人は、それを想定したクラスの構成にしておきましょう。
- 先に進んでいる人は、2つ以上のリソースを取得するプログラムを提出してもかまいません。
- このプログラムで取得するリソースは、最終課題で用いるリソースの「候補」でかまいません。
つまり、この先の検討により利用しなくなってもかまいません。
- ファイル名: (指定なし)
- 提出先: 授業フォルダの第7回
- 提出期限: 次回の前日 18:00
- 備考: 動作するに至らなかった人は、作成途中のものを提出すること。
その場合、動かなかった機能をファイル先頭にコメントで記述すること。
- 課題6
- 課題6: フィードからの情報抽出
任意のフィードを取得し、その各item要素の子要素である title, link, description 要素の情報を取り出しましょう。
フィードを表す Feed クラス、フィード内の 1つの item 要素を表す Item クラスを設計しましょう。
Feed クラスに動作確認用の mainメソッドを実装し、そこで任意のフィードの全要素の情報を表示させましょう。
- フィードは RSS または Atom です。
Atom の場合、RSS の item 要素に相当する要素は entry 要素ですので、
そう問題文を読み替えてください。
- 動作確認用のフィードには好きなものを選んでください。
その際、RSS 1.0 (root要素がRDF), RSS 2.0 (root要素がrss), Atom(root要素がfeed),
それぞれで要素や階層構造が異なりますので、
自分の見つけてきたフィードがどの仕様に基づいたものなのか特定しましょう。
- description要素のあるフィードを指定しましょう。
https://news.yahoo.co.jp/pickup/rss.xml
は description要素がないレアなフィードなので、他のものにしましょう。
- XPath を用いましょう。
- Feed クラスの設計
- フィードの URL(urlString), DOMツリー(document)を表す属性(フィールド)を用意しましょう。その他の属性を追加してもかまいません。
- URL を与えると フィードの情報を取得し DOMツリーを構築するコンストラクタを用意しましょう。
- DOM ツリーの構築には「XML文書とDOM」のページにある DocumentViewer.java に実装されている buildDocument メソッドをそのまま使いましょう。
- DOM ツリーを走査して Itemオブジェクトのリストを返すメソッド getItemList を用意しましょう。
「XPathによる特定部分の指定」にあるものが参考になります。
- main メソッドでは Feed クラスのインスタンスを生成し、全要素の情報を表示させましょう。
- Item クラスの設計
- タイトル(title)・リンク先(link)・説明(description)を表す属性(フィールド)を用意しましょう。その他の属性を追加してもかまいません。
- toString メソッドを用意しましょう。
- ファイル名: Feed.java, Item.java
- 提出先: 授業フォルダの第6回
- 提出期限: 次回の前日 18:00
- 課題5
- 課題5: Webページからの情報抽出 (オブジェクト指向)
Yahoo! ショッピングの任意の商品のページを取得し、その商品の名前・価格・送料を調べましょう。
Yahoo! ショッピングの 1商品を表すクラス YahooShoppingItem を設計し、動作確認用の mainメソッドを実装しましょう。
- 名前(title)・価格(price)・送料(shipping)を表す属性(フィールド)を用意しましょう。その他の属性を追加してもかまいません。
- URL を与えると 属性の情報を取得する fetch メソッドを用意しましょう。
- URL を与えると 属性の情報を取得するコンストラクタを用意し、内部で fetch メソッドを呼び出しましょう。
- main メソッドでは、商品の数だけ YahooShoppingItem インスタンスを生成するデモをしてみましょう。
- ファイル名: YahooShoppingItem.java
- 提出先: 授業フォルダの第5回
- 提出期限: 次回の前日 18:00
- 課題4
- 課題4: Webページからの情報抽出 (正規表現を使用)
Yahoo! ショッピングの任意の商品のページを取得し、その商品の送料を調べましょう。
正規表現を活用してください。
また、送料の値を整数値として得るようにしましょう。送料無料の場合は 0、送料不明の場合は -1 の値を取るようにしてください。
- 課題3
- 課題3: Webページからの情報抽出 (Stringクラスのメソッドを使用)
Yahoo! ショッピングの任意の商品のページを取得し、その商品の送料を調べましょう。
String クラスのメソッドを活用してください。
- 送料無料の場合には、その旨表示されるようにしましょう。
- 送料の情報がなかった場合には、その旨表示されるようにしましょう。
- ヒント
- まずは「送料〇〇円」あるいは「送料無料」と書かれている行だけを表示してみましょう。
- 練習として、「送料」という文字列が含まれている行の行全体を表示するプログラムを作成しましょう。
String クラスの contains メソッドか indexOf メソッドを使います。
文字列 line に対して、文字列「送料」が含まれているかを尋ねるには
line.contains("送料") とします。戻り値の型は boolean です。
- String クラスの indexOf メソッドを利用して、指定した文字列の出現する先頭の位置を調べることができます。
文字列 line に対して、文字列「送料」が含まれている位置を尋ねるには
line.indexOf("送料") とします。戻り値の値は、文字列 line に「送料」が現れる場合は「送」の位置、
現れない場合は -1 です。
- 開始位置、終了位置を指定して、文字列の一部を substring メソッドを利用して抜き出すことができます。
文字列 line の beginIndex 文字目から endIndex 文字目の直前までを抜き出すには
line.substring(beginIndex, endIndex) とします。戻り値は抜き出した文字列です。
- 複数の商品ページでテストしましょう。
- 追記: Yahoo! ショッピングのサイトで検索すると、Yahoo!ショッピングではなくPayPayモールの商品もヒットしますが、
両方のサイトのページに対応する必要はありません。
- 追記: 接続する際に javax.net.ssl.SSLException: Received fatal alert: protocol_version という例外が発生する場合には、
mainメソッドの先頭に以下の行を追加してください。
System.setProperty("https.protocols", "TLSv1.2");
- ファイル名: YahooShoppingShippingExtractor.java
- 提出先: 授業フォルダの第3回
- 提出期限: 次回の前日 18:00
- 課題2
- 課題2: 「妥当な」XML文書ファイルの作成
自分が記述したいデータを決め、そのデータを記述するのに適したデータ記述言語を設計し、実際にデータを記述してください。
記述する対象は、趣味のデータでもなんでもかまいません。
データ記述言語を設計するにあたっては、意味的に適切な構造を持つようにしてください。
意味的に適切な構造を持つとは、例えば、実世界で階層構造を持つものは、
XMLの構造上も階層構造を持っている、といったことです。
5階層以上の構造を持つようにしてください。
- スキーマを記述する必要はありません。
- 実際のデータを記述してください。内容はダミーでもかまいません。
- ファイル名の拡張子は「.xml」としてください。
- 文法的に正しい整形式の文書になっているか、ブラウザで表示させてみるなどして提出前に確認をしてください。
- 提出先: 授業フォルダの第2回
- 提出期限: 次回の前日 18:00
- 課題1