Document Type Definition
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Document Type Definition(文書型定義、DTD)とは、SGML や XML において、文書構造(文書型)を定義するためのスキーマ言語の一つである。 DTD では、SGML や XML の文書内に記述することができる要素やその発生順序、発生回数、要素がもつ属性、属性の型などを、記述することができる。
他のスキーマ言語と同様に、DTD においても、文書構造を厳密に定義することによって、SGML や XML の技術を利用する際の、処理の正確性や安全性を高めることができる。 SGML や XML の文書処理を支援するライブラリの多くは、SGML や XML の文書が DTD による文書構造に従っているかどうかを検証する機能を備えている。
もともとは SGML のスキーマ言語として開発され、SGML から派生した XML においても、スキーマ言語として採用されている。 例えば、SGML の応用技術である HTML や、XML の応用技術である XHTML では、DTD によって文書構造が定義されている。
現在では、XML技術を利用する場合には、スキーマ言語として DTD を採用するケースは少なくなる傾向にある。 XML が勧告された後、DTD に対してはいくつかの欠点(XML の文法とは異なる文法を採用している、XML名前空間に対応していない など)が問題として指摘されてきたためである。 そのため、XML技術は広く普及したものの、DTD の欠点が XML技術を柔軟に活用する際の障害の一つとなっていた。
この問題を解決するために、新たなスキーマ言語として RELAX NG や XML Schema などが開発され、それらを採用する事例が増えている。
目次 |
[編集] DTDの構造
DTDは、要素型宣言、属性リスト宣言、エンティティ宣言(または、実体参照宣言)、記法宣言により構成される。
[編集] 要素型宣言
対象の SGML/XML文書において使用する要素を宣言し、その要素の名前、関連する要素との親子関係および出現順序を定義する。
<!ELEMENT 要素名 構成要素>
このとき、要素名は、対象の要素の名前であり、構成要素は、以下の種類に分けられる。
[編集] EMPTY
対象要素に子要素が存在しない場合(例えば、後述する属性のみの場合など)に指定する。
<!ELEMENT foo1 EMPTY>
[編集] ANY
対象要素配下に任意の要素、任意のデータが格納される場合に指定する。
<!ELEMENT foo2 ANY>
[編集] 子要素
対象要素配下の子要素の順番および出現回数を指定する。
<!ELEMENT foo1 (bar1,(bar2|bar3)*)>
[編集] 属性リスト宣言
対象の SGML/XML文書の要素が持つ属性の型やデフォルト値を定義する
<!ATTLIST 要素名 属性名 属性値の候補、または型 デフォルト値>
例えば、俳優の出身地域を属性として定義する場合、以下のような属性リストが考えられる。
<!ATTLIST 俳優 出身地域 (北海道|東北|関東|甲信越|東海|北陸|近畿|四国|九州|沖縄) "関東"> ... <俳優 出身地域="東海">俳優A</俳優>
[編集] エンティティ宣言、記法宣言
エンティティ宣言は、対象の SGML/XML文書内に記述できるエンティティ参照について定義する。SGML/XML文書内でエンティティ参照を記述すると、DTD のエンティティ宣言にしたがって、文字列を置換したり、外部ファイルの内容を埋め込むことができる。
<!ENTITY greeting "こんにちは"> <!ENTITY external-file SYSTEM "external.xml">
記法宣言は、対象の SGML/XML文書内から参照する外部ファイルの種類 (例えば JPEG など) を指定する。
[編集] DTDの例
簡単な DTD の例を示す。
<!ELEMENT firstName (#PCDATA)> <!ELEMENT secondName (#PCDATA)> <!ELEMENT info ANY> <!ELEMENT data (firstName,secondName,info?)> <!ELEMENT myDocument (data)*> <!ATTLIST data age CDATA #IMPLIED>
この DTD では以下の内容が記述されている。
- 第1行: firstName要素を宣言している。この要素は内容として文字列データをもつ。
- 第2行: secondName要素を宣言している。内容として文字列データをもつ。
- 第3行: info要素を宣言している。内容として、この DTD で宣言された任意の要素や文字列データを、もつことができる。
- 第4行: data要素を宣言している。内容として firstName、secondName、info の各要素をもつ。要素の出現順序はこの順番でなければならない(例えば firstName の前に secondName が出現してはならない)。 "?" はオプショナルであることを示す。info要素は secondName要素の後に、出現しても良いし出現しなくても良い。
- 第5行: myDocument要素を宣言している。内容として 0個からn個の data要素をもつ。
- 第6行: data要素の属性リスト宣言をしている。data要素は age属性をもつ。age属性は文字列データであり、省略することが可能である。
この DTD に従って作成した XML文書の例
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE myDocument SYSTEM "example.dtd"> <myDocument> <data age="29"> <firstName>Fred</firstName> <secondName>Bloggs</secondName> </data> <data> <firstName>Tony</firstName> <secondName>Blair</secondName> <info>PM of UK</info> </data> </myDocument>