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)、つまり、属性リストを宣言するものです。関連する要素名に続いて、属性名を指定し、そのデータ種別と初期値を決定します。
属性のデータ種別は大きく3つに分けられており、文字列型トークン型列挙型 という方法があります。データ種別とは、属性の性質を明確にする重要な要素です。それぞれのデータ種別は以下の通りに区別されています。
データ型種別 内容
CDATA文字データ 文字データを表わす型。任意の文字を記述することができる。
ENTITYエンティティ参照 置換文字列を表わす型。名前の命名規則に従った名前文字を記述することができる。
ENTITYS複数のエンティティ参照 置換文字列を表わす型が複数存在する型。名前の命名規則に従った名前文字を記述することができる。
ID識別子 識別子を表わす型。名前の命名規則に従った名前文字を記述することができる。
IDREF参照識別子 他の要素を参照できる識別子を表わす型。名前の命名規則に従った名前文字を記述することができる。
IDREFS複数の参照識別子 他の要素を参照できる識別子を表わす型が複数存在する型。名前の命名規則に従った名前文字を記述することができる。
NMTOKEN名前トークン 文書のセキュリティレベル。言語名やコードを表わす型。名前で使用できる文字を1文字目から記述することができる。
NMTOKENS複数の名前トークン 文書のセキュリティレベル。言語名やコードを表わす型が複数存在する型。名前で使用できる文字を1文字目から記述することができる。
NOTATION記法 因果関係を表わす型。NOTATION宣言された名前文字を記述することができる。
列挙列挙型 データの候補を書き並べる型。名前で使用できる文字を1文字目から記述することができる。
エンティティ宣言
エンティティ(ENTITY)とは、日本語では「実体」と呼びます。ある種の文字列などの内容に「名前」を付けて定義しておき、それ以後は名前を書くだけで容易に何度でも参照できるようにすることができるのです。
定義された名前を参照するときに、その名前の直前にアンパサンド記号 & を、名前の末尾にセミコロン ; を添えます。
DTDにおけるエンティティ宣言には、大きく分けて2つに分類されます。
一般実体
一般実体とは、テキストとして記述することができない記号や文字などを含みます。
例えば不等記号の小なりという記号 < は、そのまま < とは記述することができません。何故ならば、この記号は、タグを囲む「開始区切り子」として解釈されるメタ文字だからです。
一般実体の DTDエンティティ宣言
<!ENTITY lt "&#60;">
<!ENTITY gt "&#62;">
<!ENTITY amp "&#38;">
<!ENTITY apos "&#39;">
<!ENTITY quot "&#34;">
一般実体の <> あるいは & などは、何故 &lt;、&gt;、&amp; と宣言できないのでしょうか、何故、16進数で記述する必要があるのでしょうか。
例えば、以下のエンティティ宣言を見てみましょう。
<!ENTITY lt "&lt;">
これはエラーになります。何故なら、名前に lt を利用しているにもかかわらず、参照する文字列がまったく同じでは、定義が循環するという矛盾に陥ります。そのため、名前を変えるか、あるいは16進数で記述するのが妥当というわけです。
一般実体の一覧はこちら 実体参照符号一覧
パラメータ実体
XMLインスタンスを作成する上で、制作者が恩恵にあずかるのが、パラメータ実体のエンティティ宣言です。
1つの 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」という文字列に関連付けることができます。


Valid XHTML 1.1! Valid CSS! 初版更新日 2003年10月12日   最新更新日 2004年3月31日
Copyright(C) 2002〜2004 banban@scollabo.com