Webアプリ開発事始 第19回

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

DTDとデータ構造の定義

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)
<!ELEMENT 氏名 (#PCDATA)>
<!ELEMENT 所属 (#PCDATA)>
<!ELEMENT 役職 (#PCDATA)>
]> (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などのプログラミング言語で簡単に作れます。


トップページ
XMLとテーブルの構造
DTDとデータ構造の定義
データ構造の定義
DTDの書式
DTDを別ファイルにする
DTDでシステムの差を吸収
複数レコードの表示方法
表形式でレコードを表示する
あとがき

Copyright © MESCIUS inc. All rights reserved.