Webアプリ開発事始 第19回

XMLとWebアプリケーション(2)
~データベースとXML
長谷川裕行
有限会社 手國堂

XMLとテーブルの構造

データベースに記録されたデータとは、テーブルの内容やビューの結果となるレコードの集合――つまりレコードセット(行セット)です。XMLは、タグによってレコードの構造を定義できます。


- レコードの構成を定義 -

レコードは、1個以上のフィールド(列)で構成されており、フィールドには名前とデータ型(および、それに付随するいくつかの情報)という属性があります。

例えば「社員」の情報が、以下のようなフィールド構成であるとします。

  社員ID 氏名 読み 所属 役職 生年月日 入社年月

実際には、「所属」(部署)や「役職」は別途マスターテーブルが用意されており、そこへIDをキーにしたリレーションが設定されるはずですから、「部署ID」「役職ID」などとなっているでしょう。ここでは説明を簡略化するため、最初はそういった複雑な構成を考えないことにします。

「社員ID」は数値型(long integer)、「氏名」や「読み」はテキスト型(var char)で40桁など、それぞれのフィールドには型が定められているはずです。XMLでは、タグを使ってレコードの構成(フィールドと、フィールドのデータ型など)を定義できます。これが、XMLがデータベースを扱うのに適した言語である理由です。


- 階層構造を表現 -

前回紹介した、社員1人分の情報を記述したXML文書とスタイルシートを、もう一度見てみましょう(リスト1、リスト2)※。

<社員>~</社員>の間に、<番号>~</番号>などの要素が列挙されています。<社員>~</社員>が1件分のレコードで、<番号>~</番号>や<氏名>~</氏名>がそのレコードを構成するフィールドとみなせます。これら<項目名>~</項目名>で区切られた1項目を、XMLでは「ノード(node)」と呼びます。

つまりリスト1のXML文書は、以下のような階層構造を表現していることになります。

項目の集合:社員
その中の要素:番号
その中の要素:氏名
その中の要素:所属
その中の要素:肩書

リスト1:山中総務部長の情報を記録したXMLファイル~members01.xml
リスト2:XML文書の表示方法を指定するスタイルシート~members01.xsl


- 複雑な階層表現 -

外側の<社員>~</社員>は、その中にある各項目の集合全体を表します。

スタイルシートを見れば、<xsl:template match="/">という記述があります。“/”記号は、XML文書に記述されたデータ全体を表わします。これをルートノードと言います。ルートの下に「社員」、さらにその下に「氏名」や「所属」などの要素があり、これらを子ノードと呼びます。

テンプレートで<xsl:template match="/">としてルート(/)を指定すると、すべてのデータが処理対象となります。

<xsl:value-of select="社員/番号" />とすれば、「社員」の子ノード「番号」の値だけを取り出すことを示します。このように、/記号はUNIXのパス区切り記号と同じ意味合いで、ノードの親子関係を示す区切り記号となります。

つまりXMLでは、タグで囲まれた要素をネストすることで、要素の階層構造が定義できるということです。


- 複数のレコードを記述する -

実際にデータベースのデータをXMLで扱う場合、レコードが1件だけということはまずありません。

先の社員情報に複数の社員のデータが記録されているとしたら、XML文書はリスト3のようになるでしょう。同じ内容のテーブル(またはレコードセット)があるとすれば、その内容は表1のようになっているはずです。

リスト1で1件だけ表示していた場合は、<社員>~のタグで囲まれた構造が1つだけでした。これが1件のレコードに当たる訳ですから、複数のレコードを記録する場合には、<社員>~のタグで囲まれた構造がレコードの件数分記述されます。

リスト3:複数のレコードを記述したXML文書~members02.xml
表1:リスト3のXML文書と同じデータを記録したデータベースのテーブル


- リレーションとXMLの階層構造 -

例えば先の社員の情報で、テーブルがリレーションされて以下のような構造になっていたとします。

項目の集合:社員
その中の要素: 番号
その中の要素: 氏名
その中の要素: 所属ID - 部署マスターテーブルを参照
部署名
内線
その中の要素: 役職ID - 役職マスターテーブルを参照
役職名

これをXMLで書き表すと、以下のようになります。<所属>の下の<内線>のデータは、データベース処理で言えば<所属ID>の値からリレーションをたどって、「部署マスター」テーブルの「内線」フィールドから導出した値です。これを、<所属>要素の下の階層に記述できます。

<社員情報>
  <社員>
    <番号>1001</番号>
    <氏名>山中 重義</氏名>
    <所属>総務部</所属>
      <内線>2346</内線> -  部署マスターテーブルから
    <役職>部長</役職> 導出したデータ
  </社員>
</社員情報>

このような構造のデータを表示する方法については、本記事後段の「表形式でレコードを表示する」で紹介します。


トップページ
XMLとテーブルの構造
レコードの構成を定義
階層構造を表現
複雑な階層表現
複数のレコードを記述する
リレーションとXMLの階層構造
DTDとデータ構造の定義
複数レコードの表示方法
表形式でレコードを表示する
あとがき

Copyright © MESCIUS inc. All rights reserved.