DTDはXMLの表現するデータ構造を、自在の内容に先立って定義しておく機能です。これによって、複雑な構造のデータベースをまったく処理方法の異なる他のシステムに受け渡しできます。
- データ構造の定義 -
上の例のように、XML文書でデータベースの内容を記述する場合、1件のレコードに相当する基本的な構造が件数分繰り返し記述されます。例ではフィールド数が少なく、項目名を見ればその意味がすぐに分かりますが、実際のデータベース処理では、もっと複雑な形態となるでしょう。
単にデータ構造を正しく画面表示するだけなら、XSLを記述しておくだけで構いません。しかし、組織間やアプリケーション間でXML文書をやり取りし、受け取ったXML文書をデータベースとして扱いさらに加工するような場合、レコードの構成――データ構造を明確にしておく必要が生じます。それがDTDの役割です。
- DTDの書式 -
DTDは、以下のような形式で記述します。
<!DOCTYPE ルート要素 [ 要素定義 ]>
「ルート要素」とは、データ構造の出発点となる要素で、つまりXML文書の示す内容そのものです。
「要素定義」の部分では、さらに以下のような形で個々の要素を必要数定義します。
<!ELEMENT 要素名 (内容定義)>
要素が値を持つ(=テーブルのフィールドに該当する)場合は、「内容定義」に“#PCDATA”と記述します。ある要素がさらに複数の要素の集合となる場合は、「内容定義」の箇所に子要素名を列挙し、さらに子要素についての定義を必要数繰り返します。
リスト3の<!DOCTYPE 社員情報 [ ... 以降 ]>までがDTDで、以下のような構造を定義していることになります。
<!DOCTYPE 社員情報 [ |
|
(1) |
<!ELEMENT 社員情報 (社員)+> |
|
(2) |
<!ELEMENT 社員 (番号,氏名,所属,役職)> |
|
(3) |
<!ELEMENT 番号 (#PCDATA)> |
|
(4) |
]> |
|
(5) |
(1) |
ルート要素“社員情報”の定義開始 |
(2) |
要素“社員情報”の定義:子要素“社員”を複数繰り返す 要素を複数繰り返す場合、要素名に続く( )内に子要素名を記述し、その後ろに+記号を付けます。 |
(3) |
子要素“社員”の定義:番号,氏名,所属,役職の4つの子要素で構成 要素名に続く( )内に子要素名を列挙します。 |
(4) |
要素“番号”の定義:最小単位の要素なので、値を持つ |
(5) |
ルート要素“社員情報”の定義終了 |
- DTDを別ファイルにする -
DTDは別ファイルとすることもできます。その場合、XML文書では以下のように記述しておきます(リスト4)。
<!DOCTYPE ルート要素 SYSTEM "DTDファイル名" />
別ファイルとしたDTDでは、<?xml version="1.0"...のXML宣言行に続けて、<!ELEMENT...以下のデータ構造定義部分を記述します(リスト5)。
リスト4:DTDを別ファイルとした場合のXML文書~members03.xml
リスト5:members03.xmlのDTD~members03.dtd
- DTDでシステムの差を吸収 -
このようにDTDを用いると、異なるシステム間や組織間でのデータ構造の違いを、データを処理する前段で吸収できるようになります。
以下のように、実質は同じでもフィールド名の異なるテーブルを使っている2つのシステムがあるとします。
Aシステム |
|
Bシステム |
商品ID |
----> |
部品番号 |
品名 |
----> |
部品名称 |
単価 |
----> |
仕入単価 |
数量 |
----> |
点数 |
Aシステムの処理結果を、データベースの形態のままBシステムに送っても、Bシステムでは処理できません。データベース処理のフロントエンドに、異なるRDBMSの管理する異なる構造のテーブルを自システム用に変換する処理を差し込む必要があります。
ところがこのデータをXMLで送信すれば、簡単なテキスト処理でAシステムのデータをBシステムで使えるよう変換できます。あとは、BシステムでXMLデータを読み込んで処理を行うだけです。
このような場合に、実際のデータに先立ってデータ構造を定義するDTDが役立つのです。DTDを読み込み、続くデータ部分の要素名などを書き換える処理なら、JavaやC言語、あるいはPerlなどのプログラミング言語で簡単に作れます。
|
|
|