DTDとは何か
XMLの構造ルール(どんな要素があるか、要素の入れ子構造、属性の定義などなど)を定義する方法の1つ。Document Type Definition(文書型定義)の略
他にも、XML Schema(XSD)、RELAX NG、Schematronといった方法がある
DTDを書く場所は次の2つに大きく分けられる
具体的な場所は以下のリンク先を参照
HTML&CSSと同じ感じ。要は中に直書きか外に切り出すか。
(1)内部サブセット
XML文書の中に直接直書き
サンプル
<?xml version="1.0" encoding="UTF-8"?>
<!-- ↑ XML宣言 -->
<!DOCTYPE note [
<!-- ↓ ここからDTD(内部サブセット) -->
<!ELEMENT note (to,from)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!-- ↑ ここまでDTD -->
]>
<!-- ↓ ここからXML本文 -->
<note>
<to>Alice</to>
<from>Bob</from>
</note>
(2)外部サブセット
外部ファイル(.dtd)として分離する
〇〇〇.dtdという別ファイルにDTDを書き、XML本体でそれを参照
サンプル
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "sample.dtd">
<note>
<to>Alice</to>
<from>Bob</from>
</note>
<!ELEMENT note (to,from)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
〇〇〇.dtdとして切り出すことで、複数のXMLで使い回せる
外部サブセットとして、DTDを読み込ませる方法には次のようなものもある
SYSTEMで読み込ませるDTDのファイルを指定
SYSTEMの後ろには、sample.xmlがあるフォルダを基点とするsample.dtdまでの相対パスを書く(※絶対パスでもよい)
⇒上記の場合、以下のような配置を想定
/project/
├─ sample.xml
└─ sample.dtd
※次のようなフォルダ構成の場合
/project/
├─ sample.xml
└─ dtd/
└─ sample.dtd
<!DOCTYPE root SYSTEM "dtd/sample.dtd">
とする。
※次のようなフォルダ構成の場合
/project/
├─ sample.dtd ← 親フォルダ側にある
└─ xml/
└─ sample.xml ← ここが基点
<!DOCTYPE root SYSTEM "../sample.dtd">
とする。
DTDの全体構造
(1)要素型宣言(element type declaration)
XML文書を構成する要素の名前、要素の内容(文字データ、親子関係)、要素が登場する順番について定義する。ELEMENTキーワードを使用して記載
(2)属性リスト宣言(attribute list declaration)
XML文書内の要素が持つ属性の名前、型、デフォルト値を定義する。ATTLISTキーワードを使用して記載
XMLそのもの(基本仕様)には、タグ名や属性名に「データ型」という概念はないが、DTDやXML Schema(XSD)で定義できる
(3)実体宣言(entity declaration)
XML文書本体やDTDから参照される実体の名前や実体の内容を定義する。ENTITYキーワードを使用して記載
(4)記法宣言(notation declaration)
外部リソース(画像データなど、XML文書以外のもの)のデータ形式を定義する。NOTATIONキーワードを使用して記載
主な参考資料
①XMLマスター教科書 ベーシックV2 森田 浩美・中原 敬子 (著)
②わわわIT用語辞典「DTD」
https://wa3.i-3-i.info/word13460.html
③わわわIT用語辞典「サブセット」
https://wa3.i-3-i.info/word15233.html
④XMLマスターポイントレッスン ~ ベーシック編 ~
https://www.xmlmaster.org/article/d01/