要素型宣言
XML文書を構成する要素の名前、要素の内容(文字データ、親子関係)、要素が登場する順番について以下のように定義する。(公式の対応部分は https://www.w3.org/TR/xml/#elemdecls )
<!ELEMENT 要素名 内容モデル> <!--コメントはXMLと同じ-->
「要素名」に関するルール
(1)要素の名前を記述する。要素名の大文字小文字は区別される。
(2)同じ要素名を持つ要素型宣言を複数指定することはできない
(3)要素名に指定された要素は、内容モデルに記述された要素の「親要素」となる
「内容モデル」に関するルール(=制約条件)
・対象となる要素に関連付けられたルール(規則)のこと
・その要素にどのような内容を持たせるのかをパターンとして指定
内容モデルで指定可能な記号
| 指定可能な記号 | 説明 |
|---|---|
| ,(コンマ) | 各要素を区切り、順番を指定する |
| |(または) | | で区切られた要素のいずれか1つだけが出現する |
| ? | 要素が0回または1回出現可能 |
| *(アスタリスク) | 要素が0回以上出現可能 |
| + | 要素が1回以上出現可能 |
| () ※半角括弧 | ひとまとまりの要素を表す。入れ子にすることができる |
内容モデルとして指定可能なパターン
| 指定可能なパターン | どのような制約か | DTDに実際どう書くか | 左のパターンを満たすXMLの例 |
|---|---|---|---|
| 要素A (#PCDATA) | 要素Aが子要素として テキストノードだけ 持つことを許す (※空要素は×) |
<!ELEMENT sample (#PCDATA)> |
<sample> 何らかの文字列 </sample> |
| 要素A (子要素名一覧) | 要素Aのタグが、 記載した子要素のタグを ちょうど1つだけ 持つことを許す (※空要素は×) |
<!ELEMENT sample1 (sample2)> |
<sample1> <sample2> </sample2> </sample1> |
| 要素A (#PCDATA | 子要素名一覧)* | 要素Aのタグが、 記載した子要素の タグとテキストノードが 0回以上、好きな順番で 入ることのみを許す (※空要素は×) |
<!ELEMENT sample1 (#PCDATA | sample2)*> | <sample1> サンプル <sample2> </sample2></sample1> |
| 要素A (要素B,要素C) | 要素Aのタグの子要素 として要素Bのタグ、 要素Cのタグが 順番に1個ずつ 入ることを許す (※空要素は×) |
<!ELEMENT sample1 (sample2, sample3)> | <sample1> <sample2> </sample2> <sample3> </sample3> </sample1> |
| 要素A EMPTY | 要素Aが空要素 (要素がない状態) である状態のみ許す |
<!ELEMENT sample EMPTY> | <sample> </sample> |
| 要素A ANY | 要素Aの中身は 何でもOK |
<!ELEMENT sample ANY> | <sample> 任意の要素 </sample> |
上から3つめの形は参考資料によっては「混合内容」と呼ばれているが、
・末尾の「*(アスタリスク)」を書かないとエラーになる
・要素A (#PCDATA \| 子要素名一覧)+ や 要素A (#PCDATA \| 子要素名一覧)?としてもエラーになる
実際は上記の記号とパターンを以下の例のようにもっと組み合わせてるっぽい
sample.dtd
<!ELEMENT root (a, (x|y)*)>
<!--root要素の中にはa要素が1回出現し、次にx要素とy要素のいずれかが0回以上出現するという制約-->
<!ELEMENT a (#PCDATA)> <!--a要素はテキストノードのみ持つことを許される-->
<!ELEMENT x (#PCDATA)> <!--x要素はテキストノードのみ持つことを許される-->
<!ELEMENT y (#PCDATA)> <!--y要素はテキストノードのみ持つことを許される-->
上記のsample.dtdを満たす妥当なXML文書の例
sample.xml
<!DOCTYPE root SYSTEM "sample.dtd">
<root>
<a>あ</a>
<x>エックス</x>
</root>
主な参考資料