3. DTD
XMLが木構造をとることについて、前章でお話しました。XMLで言語を作成するということは、表現したい世界を木構造にモデリングし、要素や属性を定義していくことになります。本章は、要素や属性を決定する、DTDについて記述します。
- 3.1 DTDとは
- 3.2 well-formed と valid
- 3.3 DOCTYPE宣言
- 3.4 SYSTEMとPUBLIC
- 3.5 まとめ
3.1 DTDとは
DTD(Document Type Definition)は、日本語で文書型定義とよばれるもので、XMLのスキーマ言語のひとつです。スキーマ言語とは、データの論理構造や物理構造を定める言語です。XMLは、現実の世界を木構造にモデル化して、それを要素や属性の階層構造で表現します。よって、DTDは、要素や属性の階層構造を定義するものとなります。
以下に例を示します。社員名簿を記述する言語を作成するとします。社員の情報としては、社員番号、名前、住所、年齢、所属部署、所有資格、給料、入社年月日を管理するものとします。退社した社員に関しては、データを削除せずに、退社年月日の情報を付加するものとします。また、所属部署は、所属部と所属の課を記述し、所有資格に関しては、資格名と取得日も記述することとします。
DTDには、社員の情報がどのような階層構造をとっているかが、記述されています。例えば、社員番号の親要素は、社員要素であり、所属部署には、所属部と所属課要素が子供要素としてある、という情報が記述されています。また、一人の社員に対して、入社年月日は、唯一定まるものだが、資格は、全くもっていなかったり、複数持っていたり、とまちまちです。このような、情報などもDTDに記述されます。(上の図では、括弧でくくられている要素が必須ではない要素です。)上の要素の階層構造をDTDで記述すると以下のようになります。
<! DOCTYPE 社員名簿 [ <!ELEMENT 社員名簿 (社員+)> <!ELEMENT 社員 (社員番号, 名前, 住所, 年齢, 所属部署, 入社年月日, 所有資格*, 退社年月日?)> <!ELEMENT 社員番号 (#PCDATA)> <!ELEMENT 名前 (#PCDATA)> <!ELEMENT 住所 (#PCDATA)> <!ELEMENT 年齢 (#PCDATA)> <!ELEMENT 所属部署 (所属部,所属課)> <!ELEMENT 所属部 (#PCDATA)> <!ELEMENT 所属課 (#PCDATA)> <!ELEMENT 入社年月日 (#PCDATA)> <!ELEMENT 所有資格 (資格名,取得日)> <!ELEMENT 資格名 (#PCDATA)> <!ELEMENT 取得日 (#PCDATA)> <!ELEMENT 退社年月日 (#PCDATA)> ]>
ところで、XMLは木構造をとると記述しました。XMLでは、木構造の1番根っことなる、ルート要素というものが存在します。ルート要素以外の要素は、必ず、親要素をひとつだけもちます。そして、要素の親をたどっていくと、必ずルート要素になります。上の例では、社員名簿要素がルート要素になります。XML文書では、ルート要素の開始タグと終了タグの間にすべての要素が含まれます。例えば、以下のXML文書は、エラーとなります。
<?xml version="1.0"> <error>このような文書はエラーになります。</error>
<error>ルート要素が存在しないからです。</error>