XML入門
プログラミング基礎の基礎
書誌
| text | 唯野 |
| author | 長谷川裕行 |
| publisher | ソフトバンク |
| year | 『C MAGAZINE 2001.2』p.14-30 |
履歴
| 2001.4.10 | 読了 |
| 2001.4.15 | 公開 |
| 2002.11.22 | 修正 |
感想
いずれは避けて通れないであろう XML の入門記事。むろん、避けては通れなさそうだから最低限の予備知識だけ仕入れておこうというのが記事を読んだ大元の理由である。しかし、この長さの記事だと既に知っている事柄の方が多く、物足りない感じがした。
加えて、まとめの部分で著者が述べているように XML も DOM もまだまだ仕様として完全に固まっているわけではない。特に XML の場合、それが企業間ビジネスの根幹につながりかねないだけに、それをめぐる企業の政治的な絡みもあって進展しないであろうことは容易に想像できる。しかし、利用する側から見ると、それだけに単なる流行りだけで XML を使うのは控えたいものだし、ちゃんと標準化された技術というかたちで使えるようになって欲しいものだと思う。
# HTML でだってブラウザ戦争のような側面があったのだから
抄録
概論
XML は eXtensible Markup Language の略で、「拡張可能なマークアップ言語」という意味になる。HTML も XML も SGML (Standard Generalized Markup Launguage) を土台にしている。SGML は文書中に他の文書を埋め込むハイパーリンクによる相互参照を実現した言語で 1986 に ISO で標準化され、これが HTML へと発展した。XML は HTML が表示/印刷という限定された結果に影響を持っていたのに対し、文書の構造そのものを表現可能なところに特徴がある。
この特徴を生かすということは情報の可搬性(情報を元のまま移動する)と可塑性(新しい情報を生み出す)の広げることを意味するが、電子データにそのような性質を持たせるためにはデータの記述形式が柔軟でなければならない。なぜなら処理を一定のルールで行うためには、情報そのものが一定のルールで書式化されている必要があるためである。この点において HTML では固定的だったタグが、XML ではユーザによって自由に定義できるため、可塑性が大きく高められている。これは XML にとってみると Web が表現のための一手段に過ぎないというレベルでの可能性を提供する。
実際の XML は HTML では困難だった 1) データベースによる Web アプリケーション開発の効率化 2) アプリケーション間の効率的なデータ交換――を実現する手段として捉えることができる。特にデータベースにおいて従来の CSV 形式ではない、構造を含めたデータ受け渡しの可能な点が大きな特徴といえる。そして、ビジネスルールを統合し、既存システムを残したままでの企業間システムの差異の吸収、即ち BtoB (Buisiness to Buisiness) の基盤として注目されている。
この XML を用いて記述した文書のことを XML 文書といい、大きく以下の 3 つの構造に分かれる。
1) 宣言部 XML バージョンや使用する文字コードなど
2) DTD 部 文書内のタグ定義 (DTD : Document Type Definition)
3) 文書部 タグによる実際のデータ
XML では DTD のない文書も単に構造の正しさが検証されないタグの集合として扱われるため、表示自体は問題なく行われる。このため、DTD のない XML 文書のことを wellformated (整形済) XML 文書、DTD への参照が行われ構造が検証されるもののことを valid (検証済) XML 文書という。そして、DTD から XML 文書を検証し他の形式に変換する機能をパーサ(parser)という。
簡単なサンプル
サンプルのため各所にコメントを挿入している。いうまでもなく、XML が C++ 形式のコメントを解するわけではないので、あらかじめお断りしておく。
<h5>// 宣言</h5>
// XML バージョンと文字コードの指定
<?xml version="1.0" encodeing="Shift_JIS"?>
// 表示方法を示すスタイルシートの指定
<?xml stylesheet type="text/xsl" href="items02.xsl"?>
<h5>// DTD</h5>
<!DOCTYPE 商品一覧[
<!ELEMENT 商品一覧(商品) +>
<!ELEMENT 商品 (品番,品名,単価)>
<!ELEMENT 品番 (#PCDATA)>
<!ELEMENT 品名 (#PCDATA)>
<!ELEMENT 単価 (#PCDATA)>
]>
<h5>// 文書</h5>
<商品一覧>
<商品>
<品番>101</品番>
<品名>みかん</品名>
<単価>100</単価>
</商品>
<商品>
<品番>102</品番>
<品名>りんご</品名>
<単価>150</単価>
</商品>
<商品>
<品番>103</品番>
<品名>もも</品名>
<単価>200</単価>
</商品>
</商品一覧>
XML ではスタイルシートとして CSS と XSL を用いることができる。しかし、CSS よりは XSL の方がデータの加工した表示が可能なため表現力が高い。また XML では HTML と異なり、タグは必ず閉じられなければならない。
そして、XML ではデータの区切りにも(タグを閉じる場合と同じく) / を使うが、この場合の構造を見てみると「商品」をルートノードとした子ノードとして「品番、品名、単価」の存在する入れ子であることが分かる。更にいえば、「商品」ひとつひとつがデータベースでいうところのレコードであり、「品番、品名、単価」がフィールドに相当することが分かる。
必然的に DTD はデータ構造が複雑となってきたときにこそ意味を持ってくる。これを見ていくと、DTD は <!DOCTYPE ルート要素 [要素定義]> から始まり、<!ELEMENT 要素名 (要素定義)> で個々の要素が定義され、#PCDATA と定義された部分が値を持つ要素というかたちになる。ちなみに、DTD は外部から参照するかたちでも記述でき、その場合には <!DOCTYPE ルート要素 SYSTEM "DTD ファイル名"> と書いて、後は DTD ファイル内で <!ELEMENT ・・・ > と記述する。
<h5>// スタイルシート (items01.xsl)</h5>
<?xml version="1.0" encodeing="Shift_JIS"?>
// スタイルシートの宣言と使用する言語の宣言
// xmlns は名前空間(namespace)の指定で、ここでは W3C のそれを指定
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"
xml:lang="ja">
// 表示の指定、match 属性で何を取り出すか指示する (/ で全て)
<xsl:template match="/">
// スタイルシート中に HTML も記述でき、これはそのまま渡される
<html lang="ja">
<head>
<title>Item01</title>
</head>
<body>
<div>
<b>商品番号:<xsl:value-of select="商品/品番"></b>
</div>
<div>
商品名:<xsl:value-of select="商品/品名">
単価:<xsl:value-of select="商品/単価">
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
サンプルではスタイルシートと HTML タグの大文字/小文字を区別することで可読性を上げているが、私は習慣的に HTML タグを小文字で書いているので、ここでもそうしている。いずれにしても XML における表示部分をスタイルシートが受け持つことで文書構造との分離が実現されている。
また、XSL スタイルシートには XSL Patterns というパターンマッチ機能があり、レコードに対する抽出を行うことができる。例えば、「商品一覧/商品[@品番="301"]/品名」のように [ ] で囲まれた @ 以降に条件を記述する。このとき抽出条件として selectNodes (複数要素)、selectSingleNode (複数要素) を指定することができ、スタイルシート中でのスクリプトの埋め込みも可能なので、要素の並べ替えなども可能になっている。更に、テンプレートとして //* を指定するとルート要素以下の全ての項目の繰り返しを意味し、この場合、後は各項目に対する個別の指定だけで定義を終えることができる。
XML そのものはサーバサイド(CGI、Java サーブレット、ASP)、クライアントサイド(Java アプレット、Java スクリプト、VB スクリプト)のいずれでも利用できる。データの負荷によりサーバサイドとクライアントサイドでどちらを用いるかは変わってくるが、いずれにしても XML としての扱いに大きな違いがあるわけではない。
なお、この記事のこれ以降ではアプリケーションから XML を扱うために W3C がブラウザ用に開発したインタフェースである DOM (Document Object Model) と Java スクリプトを用いたプログラム例を取り上げている。但し、DOM は表現力の弱い部分があり Microsoft によって独自解釈されたもの(IE5 依存)を使っている。個人的にプラットフォーム依存のコードには関心がなかったため、この点は概要を捉える程度に留めた。
