ファイヤープロジェクト
DTDとは
2003-07-20T15:13+09:00   matsu
XML文書の意味付けや構造はそのXML文書を使用する人(もしくはシステム)で合意がなされていればそれでよい.だが,プログラムでXML文書をためには何らかの表現方法があった方が便利である.DTDこの表現方法を提供する.また,人同士の合意を形成する上でも曖昧さを排除するのに役立つ.
XMLは整形式文書でなければならない.しかし,それだけでは足りない.
XMLではタグを自由に決められる.だから,そのタグが何を表すのかはそのタグを作った人にきかなけらばわからない.
そんなこんなでXML文書をやりとりする人同士でタグの取り決めを行う必要がある.この取り決めを行う仕様がDTD(Data Type Definition)やXML Schemaである.ただし,より上位の取り決め,例えばhogeタグが何を指すのかという問題は,DTDではなく別のドキュメントなどで取り決めておく必要がある.DTDやXML Schemaはこの「より上位の取り決め」にもとづいて,XML文書の「構造」を定義するものである.そしてDTDやXML SchemaにしたがったXML文書を妥当性文書と呼ぶ.
DTDやXML Schemaではどんなタグ(要素)やそのタグの属性があるのかといったXML文書の構造をとりきめる.DTDはXMLとは異なる文法で記述する.XML SchemaはXMLに似た文法で記述する.ここではDTDについて説明する.
DTD
DTDはXMLファイルの頭に書いてもいいし,別ファイルに書いてXMLファイルから呼び出してもいい.DTDに書かれる内容は,
  • XML文書にどんなタグがあるのか.
  • それらのタグはどんな順番であらわれ,どんな属性があるのか.
以下の妥当なXML文書を例にしてDTDの書き方を説明する.
<?xml version="1.0" encoding="Shift_JIS" ?>

<!DOCTYPE linux[
<!ELEMENT linux (distribution)>
<!ELEMENT distribution (debian,redhat)>
<!ELEMENT debian (#PCDATA)>
<!ELEMENT redhat (#PCDATA)>
]>

<linux>
  <distribution>
    <debian>favorit</debian>
    <redhat>interest</redhat>
  </distribution>
</linux>
上のXML文書にはDTDがある.該当部分は,
<!DOCTYPE linux[
<!ELEMENT linux (distribution)>
<!ELEMENT distribution (debian,redhat)>
<!ELEMENT debian (#PCDATA)>
<!ELEMENT redhat (#PCDATA)>
]>
である.この部分は,
<!DOCTYPE linux[
.......
]>
となっている.!DOCTYPEを文書型宣言という.この中でXML文書の構造を取り決める.そして,<!DOCTYPEに続く"linux"の部分がルート要素名である.
ルート要素名以外は,
<!ELEMENT 要素名 内容 >
という形で指定する.これを要素型宣言という.そして,上の例の
<!ELEMENT distribution (debian,redhat)>
の部分では,distributionタグの内容には,debianタグとredhatタグが順に現れることを示している.同様に
<!ELEMENT debian (#PCDATA)>
では,debianタグの内容にはテキストデータ(#PCDATA)が現れることを示している.
とにかく,上記の例を試してみる.

xmllint -shell sample01.xml
xmllintコマンドはlibxml2_2.4.16-2_i386.debにある.

実行例.
$ xmllint -shell sample01.xml
/ > du
/
linux
  distribution
    debian
    redhat
/ > validate
/ > quit
上記のうち,validateコマンドが妥当性文書かどうかをチェックしてくれる.妥当性文書でない文書(多分正しく表示されません.ソースの表示でみてください.)をxmllintにかけた場合のvalidateの実行例を以下に示す.
xmllint -shell sample02.xml
/ > du
/
linux
  distribution
    debian
    turbo
    redhat
/ > validate
Element distribution content doesn't follow the DTD
Expecting (debian , redhat), got (debian turbo redhat )
No declaration for element turbo
/ > quit
ちなみに入力ファイルが整形式文書でない場合には,xmllintコマンド実行時点でエラーを返す.
matsu(C)
Since 2002
Mail to matsu