XML
XML の使用

注意事項

毎回の授業の最初に出席メールを提出せよ.

前回までの出席記録課題と提出状況 を確認せよ.

11 章 XML

11.1 XML とは

XML はタグ(例:<title>)で要素を指定する,HTML と似た文法をもっている. HTML は(本来は)人間が直接読み書きすることも想定しているが, XML はプログラム間で構造をもったデータをやりとりする目的で設計されている. 直接目に触れないところで様々なデータの標準フォーマットとして 利用されるようになってきている.

XML ではデータの処理方法が厳密に定義されている場合が多い.

使用するタグや属性,文法規則の定義を文書型定義(DTD)と呼ぶ. 多くの場合,DTD の参照先の URL を文書内に記述することで DTD を指定する.

HTML でも同じことができるが,HTML は不特定多数の読者が同じ 結果を得られることを目的としているため,文法規則があらかじめ 決められた HTML のバージョンを選び,その 文法規則に従って文書を書くことが基本となるのに対して XML では文法規則自体を自分で設計して DTD として 提供するという使い方も多い.厳密なデータのやりとりが可能 なうえにデータのフォーマットを自由に設計できるため, 多くのアプリケーションの外部データのフォーマットとして採用されている. ウェブ上で構造をもったデータをやりとりするときは XML を用いる ことが事実上の標準となっている.

11.2 XML の作成

いろいろな形式のファイルに対してそれに応じた処理を行うしくみが MIME (Multipurpose Internet Mail Extensions) である. php では header() 関数を指定して MIME タイプを "text/xml" にすることで XML ドキュメントを生成できる.

教科書 p.281 の最終行にある short_open_tag は本演習サーバでは 有効である.これは php の開始タグ <?php を書くかわりに 短縮形 <? を書いても同じ処理を行うという設定である. このため xml の開始タグ <?xml の ?までが php の開始タグとして 解釈されてしまう.

本授業では短縮形は使用しないが, 短縮形を許可する設定を前提としたソースコードも多く存在するためにどちらの 設定でも動作するようにプログラムを書くべきである. この章の例題ソースコードで以下のような xml 開始タグがあった場合,

<?xml version="1.0" encoding="ISO-8859-1" ?>

以下のように php タグで開いて echo で出力するように変更する.

<?php
 echo '<?xml version="1.0" encoding="ISO-8859-1" ?>';
?>

また計算機室で使用しているインターネットエクスプローラーでは 例 11-1 のような DTD を使用した RSS フィードに対応していない. 例 11-1 を計算機室の環境でも動作するように書き換えたものを 以下に例として示す.ex11-1.php という名前ので サーバに転送し,動作を確認せよ.

<?php header('Content-Type: text/xml');?>
<?php
echo '<?xml version="1.0" encoding="Shift_jis" ?>';
?>
<rss version="0.91">
  <channel>
    <?php
    $items = array(
      array('title' => '山本研究室',
            'link'  => 'http://www.yamamotolab.jt.u-tokai.ac.jp',
            'desc'  => '東海大学情報通信学部山本研究室のトップページ'),
      array('title' => '授業用ページ',
            'link'  => 'http://www.yamamotolab.jt.u-tokai.ac.jp/%7Ehiroshi/education/',
            'desc'  => '山本担当授業のコンテンツ一覧')
                  );
    foreach($items as $item) {
      echo "<item>\n";
      echo "  <title>{$item[title]}</title>\n";
      echo "  <link>{$item[link]}</link>\n";
      echo "  <description>{$item[desc]}</description>\n";
      echo "  <language>Shift-JIS</language>\n";
      echo "</item>\n";
    }
    ?>
  </channel>
</rss>

図11.1 ex11-1.php

XML は構造をもった情報を表現するためのもので, RSS はおそらく最も広く利用されている XML の一種である. ウェブサイトの要約,更新情報,などを決められたフォーマットで 公開するもので,軽量のデータで頻繁に更新されるものに適している. ブログシステムなどでは標準で RSS を公開する仕様が実装されて いることがほとんどで,ブログが大きく普及した原因の一つであると いわれている.

11.3 XML の解析

ここではイベントドリブン形のプログラムである XML パーサを説明する. イベントドリブン形プログラムとは,「要素(タグ)の記述が始まったら こういう動作をする」,「要素の記述が終った時にこういう動作をする」, というように何らかのイベントがあったときの動作をあらかじめ関数(ハンドラ) として登録しておき, メインプログラムではイベントの取得を繰り返して,そのイベントにあった 動作を行うことを繰り返すタイプのプログラムである.

以下のリンクから p.291 例 11-9 のファイルが得られる. リンク先のファイルを右クリックから「対象をファイルに保存」 を選び,ファイルの種類を「全てのファイル」として books.xml という名前で保存せよ.

先にメモ帳を開いておき,保存したファイルをドラッグして 表示させ,ファイル,上書き保存で,ファイルの種類を「全てのファイル」, 文字コードを「UTF-8」で同じファイル名で保存せよ.

次に winSCP で実習用サーバの  public_html 直下に 転送せよ.

例11-9 books.xml ファイル(shift-jis版)

p.293 例 11-10 の14行目の &$this は変数の 参照渡しである.サイズの大きなデータを渡すときに ポインタを渡すことで大きなデータのコピーを作成する 手間を避けている.

以下のリンクから p.293 例 11-10 のファイルが得られる. リンク先のファイルを右クリックから「対象をファイルに保存」 を選び,ファイルの種類を「全てのファイル」として bookparse.php という名前で保存せよ.

先にメモ帳を開いておき,保存したファイルをドラッグして 表示させ,ファイル,上書き保存で,ファイルの種類を「全てのファイル」, 文字コードを「UTF-8」で同じファイル名で保存せよ.

次に winSCP で実習用サーバの リンク先のファイルを public_html 直下に転送せよ.

例11-10 bookparse.php(shift-jis版)

今回の日本語を含んだPHPソースは UTF-8 で保存する. 実際には 11.3.6 節のオプションを利用することで他のエンコーディング を扱うことができる.

実習サーバ上の自分のディレクトリに保存した bookparse.php をブラウザから実行し,動作を確認せよ.

11.4 DOM によるXML の解析

DOM(Document Object Model)を用いて XML の構造を 直接扱うことができる.

正しい XML 文書はすべての要素の開きタグと閉じタグが 対応しているため,要素のネスト構造がツリーの構造を成す. たとえば,p.291 例11-9 books.xml は以下のようなツリー構造を もっている.

例11-9 books.xml のDOMツリー
図 11.2 例11-9 books.xml のDOMツリー

11.3 節のイベントベース方式の処理では,文書を上から順に処理してゆき, 要素のタグに出会うたびにばらばらに処理を行ったが, DOM による解析では文書全体を読み込んで要素のネスト関係を調査し, 木構造のデータを作ってから処理を行う.このためメモリを多く消費する欠点があるが, プログラムは p.295 の例のように簡潔であり, エラーの厳密な解析など構造に基づいた解析に向いている.

11.5 SimpleXML による解析

メモリ効率は悪いが XML データの構造の親子関係をオブジェクトの プロパティの関係に置き換えて処理できる.PHP 言語との親和性が 高く,プログラムを簡単に書く事ができる.プログラムから XML 形式の 文書を出力することもできる.

11.6 XSLTによるXMLの変換

XSLT はある文法規則に従ったXML文書を別の文法規則のXMLに変換するための言語である. 例えば速報ニュースの情報をあらかじめ決めておいた XML 形式の文書で記述し, それを自動的に変換して HTML バージョンを作成するような目的で使用される.

p.298 例 11-11 が元となるニュース速報の XML 文書で, それを HTML 形式に変換するための規則の定義が 例 11-12 のXSL 文書である.実際に 11-12 を参照しながら 変換処理を行うコードが例 11-13 である. 最初から HTML でニュースを公開する方法と比較すると, ニュースが発生したときに決められたフォーマットにそって必要な 情報を入力するだけで HTML の文法の詳細に煩わされることなく 迅速に HTML 文書を作成することができる.

11.7 ウェブサービス

異なる使用法のシステムの間でコマンドなどの差異の吸収を行う 技術としてウェブサービスが生まれた.

第 13 回課題「XML の利用」 を提出せよ.


Updated in July 10, 2012, index.html, Yamamoto Hiroshi