データベースに記録されたデータとは、テーブルの内容やビューの結果となるレコードの集合――つまりレコードセット(行セット)です。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</内線> - |
部署マスターテーブルから |
<役職>部長</役職> |
導出したデータ |
</社員> |
</社員情報> |
このような構造のデータを表示する方法については、本記事後段の「表形式でレコードを表示する」で紹介します。
|
|
|