■ DTDの有無
XML文書ではDTDの有無によって2種類に分ける事ができます。
DTDのある方をValid XML Document(妥当なXML文書)と呼び、
DTDがない、もしくはあっても文書がDTDに適合していないものを
Well-formed XML Document(整形式XML文書)と呼びます。
妥当なXML文書の方はDTDに対して、XML文書に完全に適合していなくてはなりません。整形式XML文書の方は
文書がDTDに適合していなくても、基本的なXMLの構文には適合していなくてはなりません。
■ DTDとは?
DTDは文書型定義と呼ばれます。
これは、XML文書の要素や出現順、属性の並びなどの正しいもの・間違ったものがわかるように
記述したものです。(このようなものをスキーマ言語と呼びます)
DTDがあると、ネットワーク上でXMLが壊れていないかどうか検証する事ができます。
DTDは <!DOCTYPE ルート要素名[ と ]>
の間に要素の定義などを記述します。
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE ルート要素名[
この間に要素の定義などを記述します
]>
<ルート要素名>
<子要素>要素の内容</子要素>
</ルート要素名>
■ 要素型宣言
要素型宣言とは、DTDの中で要素の種類や親子関係などを定義するものです。
<!ELEMENT と >
の間に、要素名と内容モデルを記述し、内容モデルに要素の種類や要素・親子関係を記述します。
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE ルート要素名[
<!ELEMENT ようそ (#PCDATA)>
]>
<ルート要素名>
<ようそ>要素の内容</ようそ>
</ルート要素名>
上記のように記述します。
この例では、「ようそ」という要素を要素型宣言しています。
要素名を「ようそ」、内容モデルを「(#PCDATA)」としています。
「(#PCDATA)」の ( の前は半角スペースを入れてください。
「(#PCDATA)」は要素の内容がテキストだという事を宣言しています。(タグ以外だという事)
▼ 親子関係
要素型宣言1つで、1世代の親子関係を定義する事が可能です。
親要素より下の階層にある子要素を、内容モデルの位置に並べます。
下記の例では、親要素の「ルート要素」の下にある「ようそ」と「ようそ2」
の2つの子要素を定義しています。
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE ルート要素名[
<!ELEMENT ルート要素 (ようそ,ようそ2)>
<!ELEMENT ようそ (#PCDATA)>
]>
<ルート要素>
<ようそ>要素の内容</ようそ>
<ようそ2>要素の内容</ようそ2>
</ルート要素>
このように、<!ELEMENT と >
の間に親要素名である「ルート要素」を記述、内容モデルの位置に2つの子要素を
並べて記述します。
▼ 空要素
要素には内容の無い空要素があり、空要素を定義する場合、
EMPTYキーワードを記述します。
<!ELEMENT 要素名 EMPTY>
▼ あらゆる子要素を持つ定義
細かく定義しないで、あらゆる子要素を持つという定義をすることが可能です。その場合、
ANYキーワードを記述します。
<!ELEMENT 要素名 ANY>
▼ 出現回数
「ルート」という要素が「ようそ」を子要素として持つ場合、
下記のような4つの出現パターンがあります。
<!ELEMENT ルート (ようそ)>
上記のように要素名だけを指定した場合は必ず1回出現します。
<!ELEMENT ルート (ようそ+)>
要素名と+を指定した場合は、1回以上出現します。
<!ELEMENT ルート (ようそ*)>
要素名と*を指定した場合は、0回以上出現します。
<!ELEMENT ルート (ようそ?)>
要素名と?を指定した場合は、0回または1回出現することを表します。
■ 属性リスト宣言
要素には属性があり、その属性は下記のように記述する事で定義します。
<!ATTLIST
要素名 属性名 属性値のデータ型 デフォルト値
>
例えば下記を見てみましょう。
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE ルート要素名[
<!ELEMENT ルート要素 (ようそ,ようそ2)>
<!ELEMENT ようそ (#PCDATA)>
<!ELEMENT ようそ2 (#PCDATA)>
<!ATTLIST ようそ 順番 CDATA #REQUIRED>
]>
<ルート要素>
<ようそ 順番="1番目">要素の内容</ようそ>
<ようそ2>要素の内容</ようそ2>
</ルート要素>
上の例では
要素名に ようそ
その属性名を 順番
属性値のデータ型は CDATA
でこの CDATA というのは文字データという意味です。
#REQUIRED があると必ずこの属性が必要という事です。
DTDにそのXML文書で使用することのできるタグの種類や構造を記述する事で、
XML文書の作成以外の人が構造の同じXML文書を作成する事ができます。
しかし自分だけで使用するXML文書などは、DTDを記述する必要はないでしょう。
|