DTD (Document Type Definition)
DTD
(文書型定義) とは、使用する要素と属性などの配列や記法などを、XML
データの記述に際しての仕様を決定します。基本的には、そうした決め事に従って DTD
を参照し XML
データが作成されます。
DTD
がなければ、記述された要素の意味や配列などが理解できません。XML
データは、他のコンピュータにも再利用できるわけですから、当然、そこに記述されている要素などの決め事が必要になってきます。それらを定義したものが、DTD
と呼ばれるものです。
HTML
では、DTD
は最初から決められています。HTML
では、決められた DTD
に従って、タグや属性を文書中の要素内容にマークアップし、HTML
を解釈できるソフトウェア(Webブラウザ)によって表示することができます。HTML
では、勝手に DTD
を変更することができません。
しかし、XML
では、自分自身の手によって DTD
を記述し、要素や属性、エンティティや記法、外部ファイルの扱いなどについて決定します。逆な言い方をすれば、柔軟で自由な仕様を自分の手で書けるということです。
DTD
の基本DTD
を構成する宣言は、XML
宣言のほかに、4つの宣言が定義されています。<!DOCTYPE magazineinfo [ ← ルート要素の決定 <!ELEMENT magazine (book,author,content)> ← 要素名と子要素名の設定 <!ELEMENT book (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT content (#PCDATA)> ]>
DTD
を記述する際、その冒頭で必ず行わなければなりません。magazine
要素では、括弧で囲まれた3つの子要素が設定され、その子要素は必ず1回だけ記述しなければなりません。要素の子要素は必ず括弧 () で囲みます。(book,author*,content)
と、author
要素に、アスタリスクが付記されていた場合、その子要素のみ 0回以上(記述しなくても、あるいは何回でもの意味)の記述が許されます。記号 | 説明 |
, カンマ | 1つの親要素内に、定義した順番で子要素を記述する |
| バーチカルバー | 1つの親要素内に、定義した子要素のいずれか1つを記述する |
? クエスチョン | 1つの親要素内に、子要素0回または1回を記述する |
* アスタリスク | 1つの親要素内に、子要素を0回以上記述することができる |
+ プラス | 1つの親要素内に、子要素を1回以上記述することができる |
指定なし | 1つの親要素内に、子要素を必ず1回記述しなければならない |
<!ATTLIST 要素名 属性名 データ種別 "デフォルト値">
ATTLIST
とは、その名の通り(Attribute List Declaration
)、つまり、属性リストを宣言するものです。関連する要素名に続いて、属性名を指定し、そのデータ種別と初期値を決定します。データ型 | 種別 | 内容 |
CDATA | 文字データ | 文字データを表わす型。任意の文字を記述することができる。 |
ENTITY | エンティティ参照 | 置換文字列を表わす型。名前の命名規則に従った名前文字を記述することができる。 |
ENTITYS | 複数のエンティティ参照 | 置換文字列を表わす型が複数存在する型。名前の命名規則に従った名前文字を記述することができる。 |
ID | 識別子 | 識別子を表わす型。名前の命名規則に従った名前文字を記述することができる。 |
IDREF | 参照識別子 | 他の要素を参照できる識別子を表わす型。名前の命名規則に従った名前文字を記述することができる。 |
IDREFS | 複数の参照識別子 | 他の要素を参照できる識別子を表わす型が複数存在する型。名前の命名規則に従った名前文字を記述することができる。 |
NMTOKEN | 名前トークン | 文書のセキュリティレベル。言語名やコードを表わす型。名前で使用できる文字を1文字目から記述することができる。 |
NMTOKENS | 複数の名前トークン | 文書のセキュリティレベル。言語名やコードを表わす型が複数存在する型。名前で使用できる文字を1文字目から記述することができる。 |
NOTATION | 記法 | 因果関係を表わす型。NOTATION宣言された名前文字を記述することができる。 |
列挙 | 列挙型 | データの候補を書き並べる型。名前で使用できる文字を1文字目から記述することができる。 |
ENTITY
)とは、日本語では「実体」と呼びます。ある種の文字列などの内容に「名前」を付けて定義しておき、それ以後は名前を書くだけで容易に何度でも参照できるようにすることができるのです。&
を、名前の末尾にセミコロン ;
を添えます。DTD
におけるエンティティ宣言には、大きく分けて2つに分類されます。<
は、そのまま <
とは記述することができません。何故ならば、この記号は、タグを囲む「開始区切り子」として解釈されるメタ文字だからです。DTD
エンティティ宣言
<!ENTITY lt "<"> <!ENTITY gt ">"> <!ENTITY amp "&"> <!ENTITY apos "'"> <!ENTITY quot """>
<
や >
あるいは &
などは、何故 <、>、&
と宣言できないのでしょうか、何故、16進数で記述する必要があるのでしょうか。<!ENTITY lt "<">
lt
を利用しているにもかかわらず、参照する文字列がまったく同じでは、定義が循環するという矛盾に陥ります。そのため、名前を変えるか、あるいは16進数で記述するのが妥当というわけです。XML
インスタンスを作成する上で、制作者が恩恵にあずかるのが、パラメータ実体のエンティティ宣言です。XML
インスタンスの中で何度も同じ「語句」が登場する場合、あらかじめその語句を実体として定義することで、その実体参照を記述すれば、長ったらしい文字列を記述しなくても済みます。<!ENTITY EXT "Extensible Markup Language">
XML
インスタンスは以下の通りです。<memo>XMLは、&EXT; の頭文字から、そのように呼ばれています。</memo>
&EXT;
」には、「Extensible Markup Language
」という文字列が呼び出されるわけです。いわば、ある種の「関数」の呼び出しのような感覚で利用することができます。XML
では、外部にある文書を参照することができます。特に、エンティティ宣言を外部文書から参照するなどという方法は、しばしば用いられることがあります。XML
データの一部分を外部ファイルに記述する場合、DTD
のエンティティ宣言と呼ばれる方法で、URI によって、インターネットのアドレスのパスを含んだ外部ファイルを宣言します。DTD
エンティティの外部ファイル宣言
<!ENTITY エンティティ名 SYSTEM "外部ファイルの URI">
<!DOCTYPE magazineinfo [ <!ENTITY EXT SYSTEM "ExplainLinkXML.xml"> ]>
「ExplainLinkXML」
という外部ファイルが、「XML」
という文字列に関連付けることができます。