DTDってなに?

2000年8月7日
アンテナハウス株式会社


一番簡単な例

DTD(Document Type Definition)とは、非常に簡単に言いますと文書の型を定義するものです。

「XMLの基本用語」 先頭のサンプル「表」のDTDは、次のようになります。

<!ELEMENT 表 (データ+) >
<!ELEMENT データ (日付,勘定科目,金額,備考) >
<!ATTLIST データ record CDATA #REQUIRED >
<!ELEMENT 日付 (#PCDATA) >
<!ELEMENT 勘定科目 (#PCDATA) >
<!ELEMENT 金額 (#PCDATA) >
<!ELEMENT 備考 (#PCDATA) >

説明

<!ELEMENT
要素型宣言というものです。要素型宣言に続いて、要素の名前とその要素に許される子供を指定します。
要素の名前が「表」であることを指定します。
(データ+)
「表」要素に許される子供は、「データ」要素です。+(プラス記号)は子供の要素が1回以上出現することを示します。
>
要素型宣言の終了区切りです。
データ (日付,勘定科目,金額,備考)
「データ」要素には、「日付」、「勘定科目」、「金額」、「備考」という要素がこの順番で1回ずつ出現します。
<!ATTLIST
属性リスト宣言というものです。要素に対して属性と属性値を関連付けるために使用します。
データ record CDATA #REQUIRED
「データ」要素は、「record」という属性を持ちます。「record」属性の型はCDATA(文字列型)であり、#REQUIRED(必須)であることを示します。
日付 (#PCDATA)
日付の内容は、文字データであることを示します。

XMLファイルをDTDに関連付ける

XMLファイルにはドキュメントタイプ宣言を含むことができます。ドキュメントタイプ宣言でXMLファイルをDTDに関連付けます。

「XMLの基本用語」 先頭のサンプル「表」のXMLファイルと「表」DTDを関連付けると次のようになります。

<!DOCTYPE 表 [
<!ELEMENT 表 (データ+) >
<!ELEMENT データ (日付,勘定科目,金額,備考) >
<!ATTLIST データ record CDATA #REQUIRED >
<!ELEMENT 日付 (#PCDATA) >
<!ELEMENT 勘定科目 (#PCDATA) >
<!ELEMENT 金額 (#PCDATA) >
<!ELEMENT 備考 (#PCDATA) >
]>
<表>
<データ record="1">
	<日付>5月10日</日付>
	<勘定科目>交通費</勘定科目>
	<金額>1,260</金額>
	<備考>B社まで、タクシー</備考>
</データ>
<データ record="2">
	<日付>5月10日</日付>
	<勘定科目>交際費</勘定科目>
	<金額>15,000</金額>
	<備考>B社Aさんを接待</備考>
</データ>
<データ record="3">
	<日付>5月13日</日付>
	<勘定科目>会議費</勘定科目>
	<金額>900 </金額>
	<備考>喫茶店で打ち合せ</備考>
</データ>
<データ record="4">
	<日付>5月18日</日付>
	<勘定科目>交通費</勘定科目>
	<金額>320 </金額>
	<備考>麹町から飯田橋間</備考>
</データ>
<データ record="5">
	<日付>5月20日</日付>
	<勘定科目>資料費</勘定科目>
	<金額>3,000</金額>
	<備考>研修資料費</備考>
</データ>
<データ record="6">
	<日付>5月25日</日付>
	<勘定科目>資料費</勘定科目>
	<金額>2,000</金額>
	<備考>図書(ビジネス書)</備考>
</データ>
</表>

説明

<!DOCTYPE
ドキュメントタイプ宣言というものです。ドキュメントタイプ宣言に続いて、文書型名(DTDの名前)とDTDのIDもしくはDTD本体を置きます。
文書型名が「表」であることを示します。
[
DTDの開始を示します。
]>
DTDの終了を示します。

上のように[ ]内に置いたDTDを内部DTDと言います。

外部DTD

IDを使ってXMLファイルを外部DTDファイルに関連付けることができます。

IDを使って外部DTDファイルに関連付けた例

「表」DTDの内容をファイル「table.dtd」に保存したとします。そのとき上述の例は次のように表すことができます。

<!DOCTYPE 表 SYSTEM "table.dtd" >
<表>
<データ record="1">
	<日付>5月10日</日付>
	<勘定科目>交通費</勘定科目>
	<金額>1,260</金額>
	<備考>B社まで、タクシー</備考>
</データ>
<データ record="2">
	<日付>5月10日</日付>
	<勘定科目>交際費</勘定科目>
	<金額>15,000</金額>
	<備考>B社Aさんを接待</備考>
</データ>
(中略)
<データ record="6">
	<日付>5月25日</日付>
	<勘定科目>資料費</勘定科目>
	<金額>2,000</金額>
	<備考>図書(ビジネス書)</備考>
</データ>
</表>

説明

SYSTEM
システム識別子というものです。
"table.dtd"
table.dtdファイルがXMLファイルと同じホルダにあることを示しています。