DTDで要素型宣言を定義する
DTDは、XML文書をある一定の構文に従ってルール付けするためのものです。ここではXML文書に登場する要素を規定するための、DTDの中でも最も主要な宣言である要素型宣言に注目して、DTDを説明します。
カテゴリ | DTD | |
関連要素 | <!DOCTYPE>、<!ELEMENT> | |
関連記事 | DTDで属性リスト宣言を定義する |
DTD(Document Type Definition:文書型宣言)とは、読んでのとおりXML文書の構造(型)を宣言するものです。DTDは、XSLTやDOM(Document Object Model)のような目に見える動作を制御するものではありません。そのため、どうしても初心者には「分かりにくい」「目的がみえにくい」と敬遠されがちなきらいもありますが、だからといってなんら恐れる必要はありません。
なぜなら、DTDとはXML文書を「そのまま」ある一定の構文にしたがってルール付けし、表現するものなのです。つまり、DTDを独立した単体のものとして理解する必要はないということです。DTD単体で分からなければ、DTDが表現する対象としてのXML文書と照らしあわせてみてみましょう。「DTDのこの部分はXML文書のここを表現しているんだな」という対応関係でみていくことができれば、それでもうDTDを理解できたも同然なのです(逆に、DTDとは決して実体のないものではなく、XML文書という一番身近な実体を「必ず」伴なうものなのです!)。
DTDにはさまざまな規則がありますが、本稿ではDTDを構成する最も主要な宣言である「要素型宣言」についてみてみることにします。
<?xml version="1.0" encoding="Shift_JIS" ?> <!DOCTYPE books [ <!ELEMENT books (book+)> <!ELEMENT book (title,author,published,price,publishDate,description)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT published (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ELEMENT publishDate (#PCDATA)> <!ELEMENT description (#PCDATA|keyword)*> <!ELEMENT keyword (#PCDATA)> ]> <books name="書籍情報一覧"> <book> <title>10日でおぼえるJSP/サーブレット入門教室</title> <author>Y.Yamada</author> <published>翔泳社</published> <price>2800</price> <publishDate>2002/05/17</publishDate> </book> <book> <title>JSP/PHP/ASPサーバサイドプログラミング徹底比較</title> <author>Y.Yamada</author> <published>技術評論社</published> <price>2880</price> <publishDate>2002/12/16</publishDate> </book> ……中略…… </books>
それでは、以下にDTDを含んだbooks.xmlで注目すべき3つのポイントについてまとめておくことにしましょう。
(1)文書型宣言を記述する
DTDは、対象となるXML文書の内部に記述することも(内部サブセット)、あるいは別ファイルとしてXML文書の外部に記述することもできますが(外部サブセット)、本稿ではより簡易でコンパクトにまとめられる「内部サブセット」による記述を紹介することにします。
内部サブセットの構文は、以下のとおりです。
<!DOCTYPE ルート要素名 [ <!--要素型宣言--> <!--属性リスト宣言--> <!--実体参照宣言--> <!--記法宣言--> ]>
文書型宣言配下の「要素型」「属性リスト」「実体参照」「記法」の各宣言を記述する順序は必ずしも定められてはいませんが、上記の順番で記述するのが通例です。
いずれの宣言も、記述は任意です。
(2)要素型宣言を記述する
DTDの記述は、最上位階層(ルート要素)から順番に下位の階層に下っていくイメージであるといえば、分かりやすいでしょうか。最初の
<!ELEMENT books (book+)>
では、<books>要素配下に、<book>要素が一個以上(+)存在することを示します。
<!ELEMENT book (title,author,published,price,publishDate,description)>
次の1行は<book>要素配下に記述されるべき各子要素の順番を規定します。カッコ内の要素名がカンマで区切られた場合、各要素は「この順番で」登場しなければなりません。このように宣言された場合、例えば<title>要素より前に<author>要素を記述することはできません。また、<title>以下各要素は、<book>要素配下に「必ず1回だけ記述」する必要があります。
<!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT published (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ELEMENT publishDate (#PCDATA)> <!ELEMENT description (#PCDATA|keyword)*> <!ELEMENT keyword (#PCDATA)>
続く各行は、<book>要素配下の子要素群を宣言しています。「#PCDATA」は文字データを表し、<title>以下各要素には文字データしか含まれないことを示しています。ただし、唯一、<description>要素配下には、文字データのほかに<keyword>要素が含まれる可能性があります。「(a|b)*」は「a、または(かつ)bが0回以上登場」することを示します。
(3)一般的な要素型宣言の構文を知る
以上の規則をまとめてみると、要素型宣言は以下のような構文で記述することができます。
<!ELEMENT 要素名 内容モデル>
要素名と内容モデルとの間には、必ず半角スペースを1個以上空けるようにしてください。内容モデルで指定することのできる内容は、以下のとおりです。
記述 | 意味 | |
---|---|---|
<!ELEMENT 要素名 (x)> | 要素<x>が必ず1回登場 | |
<!ELEMENT 要素名 (x*)> | 要素<x>が0回以上登場 | |
<!ELEMENT 要素名 (x+)> | 要素<x>が1回以上登場 | |
<!ELEMENT 要素名 (x?)> | 要素<x>が0または1回登場 | |
<!ELEMENT 要素名 (x,y)> | 要素<x>、<y>が順番に1個ずつ登場 | |
<!ELEMENT 要素名 (x|y)> | 要素<x>、<y>のいずれかが登場 | |
<!ELEMENT 要素名 (#PCDATA|x|y)> | テキスト、要素<x>、<y>のいずれかが登場 | |
<!ELEMENT 要素名 EMPTY> | 空要素 | |
<!ELEMENT 要素名 ANY> | DTDで宣言されたすべての要素を含むことができる |
以上、文書型宣言と要素型宣言について紹介してみました。DTDの性質上、自身でDTDを記述するケースは多くないかもしれません。しかし、ちまたには多くのXML文書が存在しています。
例えば、有名なJSP/サーブレットコンテナ(実行エンジン)であるTomcatの設定ファイルweb.xmlは、その構文規則がDTDで記述されています。そのようなときにも、DTDが読めさえすれば、たちどころに記述ルールが分かってしまうのです。DTDを理解することは、今後ますます「当たり前のように」利用されることになるXML文書を活用するための「基礎知識」でもあるのです。
Copyright © ITmedia, Inc. All Rights Reserved.