DTD(ディーティーディー)とは | 意味や読み方など丁寧でわかりやすい用語解説
DTD(ディーティーディー)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
文書型宣言 (ぶんしょがたせんげん)
英語表記
DTD (ディーティーディー)
用語解説
DTD (Document Type Definition) は、XML (eXtensible Markup Language) やSGML (Standard Generalized Markup Language) 文書の構造と内容を定義するためのルールセットである。これは、特定の種類の文書がどのような要素を含み、それらの要素がどのような順序で現れるか、どのような属性を持つかといった「文法」を記述する。DTDの主な目的は、文書がその定義された構造に適合しているか、つまり「妥当であるか」を検証することにある。文書作成者と、その文書を処理するソフトウェア(パーサー)との間で、文書形式に関する明確な合意を形成する役割を果たす。
XML文書を例にとると、DTDはXML文書の最上部にDOCTYPE宣言として記述されるか、外部ファイルとして定義され、XML文書から参照される。これにより、XMLパーサーはXML文書を読み込む際に、その文書がDTDで定められたルールに従っているかをチェックできる。もし文書がDTDのルールに違反していれば、パーサーはエラーを報告し、その文書が「妥当でない」と判断される。これは、データ交換において受信側が想定外の構造のデータを受け取ることを防ぎ、システム間の整合性を保つ上で非常に重要となる。
DTDの詳細な記述内容を見ていく。DTDでは主に、要素、属性、エンティティ、記法という4つの主要な構成要素を宣言する。
まず、要素宣言は文書が含むことのできる要素(タグ)とその内容モデルを定義する。内容モデルとは、その要素がどのような子要素を持つことができるか、またはテキストデータを持つことができるかといった規則である。例えば、<!ELEMENT book (title, author+, chapter*)>という宣言は、book要素がtitle要素を1つ、author要素を1つ以上、chapter要素を0個以上含むことを示す。+は1回以上、*は0回以上を表し、他にも?(0回または1回)や,(順序指定)、|(選択)といった記号を使って複雑な内容モデルを記述できる。PCDATA(Parsed Character Data)は要素がテキストデータを含むことを示し、EMPTYは要素が子要素もテキストデータも持たないことを、ANYはどのような内容でも許容することを示す。
次に、属性リスト宣言は特定の要素が持つことができる属性とその特性を定義する。属性は要素に追加情報を与えるためのもので、名前と値のペアで構成される。例えば、<!ATTLIST chapter id ID #REQUIRED status (draft|final) "draft">という宣言は、chapter要素がidという属性を持つことを定義する。IDは属性の型を示し、一意な識別子であることを意味する。#REQUIREDは、その属性が必ず指定されなければならないことを示す。status属性はdraftかfinalのいずれかの値を取り、デフォルト値はdraftであることを意味する。属性の型には、CDATA(単純な文字列)、NMTOKEN(XMLの名前トークン)、IDREF(別のIDを参照)などがある。デフォルト値には、#IMPLIED(任意)、#FIXED(固定値)などがある。
エンティティ宣言は、繰り返し使われるテキストや特殊文字、外部ファイルを簡潔に参照できるようにするための仕組みである。例えば、<!ENTITY copyright "Copyright 2024. All rights reserved.">という宣言をDTDに記述すると、XML文書中で©right;と書くだけで「Copyright 2024. All rights reserved.」というテキストを挿入できるようになる。これにより、文書の保守性が向上し、入力ミスも減らせる。外部ファイルを参照するエンティティ宣言は、<!ENTITY logo SYSTEM "logo.gif" NDATA gif>のように記述され、画像などの非XMLデータを参照する際に利用される。
記法宣言は、XML文書内で参照される非XMLデータの形式を指定するために使用される。これは主に、エンティティ宣言と組み合わせて、画像ファイルや音声ファイルなど、特定の形式を持つ外部リソースを処理する際に、その形式をパーサーに伝える役割を持つ。
DTDは、XML文書内に直接記述する「内部DTD」と、独立した.dtdファイルとして作成し、XML文書から参照する「外部DTD」の2つの方法で利用できる。外部DTDはさらに、公開識別子(PUBLIC ID)を持つ標準的なDTD(例: XHTMLのDTD)を参照する「PUBLIC DTD」と、システム識別子(SYSTEM ID)によってローカルなファイルパスやURLを指定する「SYSTEM DTD」に分けられる。
歴史的に、DTDはXML文書の構造定義において重要な役割を担ってきたが、その限界も指摘されてきた。特に、データ型の定義能力が弱く、日付型や数値型のような具体的なデータ型を厳密に定義できない点が挙げられる。また、XML名前空間の概念が導入された後も、DTDは名前空間を十分にサポートできなかった。これらの制約を克服するために、XML Schema Definition (XSD) やRELAX NGといったより高機能なスキーマ言語が登場した。これらの後継技術は、データ型の厳密な定義、名前空間のサポート、より複雑な構造定義の記述能力を提供し、今日のXMLデータ処理において主流となっている。
しかし、DTDはシンプルなXML文書の構造定義や、HTMLの古いバージョン(XHTMLなど)の妥当性検証においては依然として利用されている。例えば、HTML5では、<!DOCTYPE html>という簡略化されたDOCTYPE宣言が用いられるが、これはもはやDTDへの厳密な参照ではなく、ブラウザを標準準拠モードでレンダリングさせるためのトリガーとして機能する。システムエンジニアを目指す上では、DTDの基本的な概念と役割を理解しておくことは、既存のシステムやレガシーな文書形式を扱う際に役立つ重要な知識である。