DTDとは

DTD(Document Type Definition:文書型宣言)は、XML文書をある一定の構文に従ってルール付けするためのものです。DTDにより、XML文書中にどのように要素や属性があらわれるのかなどを取り決めます。

まずは以下のサンプルを見てください。

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE books[
    <!ELEMENT books    (book+)>
    <!ELEMENT book     (title,author,price)>
    <!ATTLIST book  id CDATA  #REQUIRED>
    <!ELEMENT title    (#PCDATA)>
    <!ELEMENT author   (#PCDATA)>
    <!ELEMENT price    (#PCDATA)>
]>

<books>
  <book id="0001">
    <title>吾輩は猫である</title>
    <author>夏目 漱石</author>
    <price>648</price>
  </book>
  <book id="0002">
    <title>風立ちぬ・美しい村</title>
    <author>堀 辰雄</author>
    <price>540</price>
  </book>
</books>

XML文書の後半部分はこれまでどおりの内容と同じです。前半部分(青字部分)が今回新しく登場した内容になります。

この部分がDTDです。

上記サンプルのDTDでは「いつどの要素が何回出現するのか」「その要素にはどのような属性があるか」を取り決めています。

文書型宣言

では、上記のサンプルについてひとつずつ考えていきましょう。
まず最初に、DTDの一番外側の部分に着目してください。

<!DOCTYPE books[
  …
]>

<!DOCTYPE …>の部分は、文書型宣言(document type declaration)と呼ばれ、この中に、XML文書本体における取り決めを記述します。

要素型宣言

次に、XML文書本体の中にどのような要素があらわれるかを取り決めます。

要素の取り決めは文書型宣言の中にある<!ELEMENT …>で指定します。これを要素型宣言(element type declaration)と言います。

<!ELEMENT books    (book+)>
<!ELEMENT book     (title,author,price)>

上記では「books」要素の子要素として「book」要素が1回以上出現すること、「book」要素の子要素として「title」「author」「price」の3つの要素が順に出現することを定義しています。

続いて、要素の内容について取り決めます。要素の内容が文字データの場合は「#PCDATA」と記述します。

<!ELEMENT title    (#PCDATA)>
<!ELEMENT author   (#PCDATA)>
<!ELEMENT price    (#PCDATA)>

上記では「title」「author」「price」要素それぞれについて、要素の内容が文字データであることを示しています。

内部セットと外部セット

今回扱ったサンプルではDTDをXML文書(.xmlファイル)の一部として記述していますが、XML文書本体とDTDを同じファイルには記述せず、DTDを別ファイルにすることもできます。

前者を内部サブセット、後者を外部サブセットと言います。

内部サブセットの場合、XML文書は以下のような構成になります。

XML文書構造

上図のDTD部分を別ファイルすれば外部サブセットになります。別ファイルとしておけば、複数のXML文書から参照され、共通のDTDを提供することができます。