連載
» 2003年07月16日 10時00分 公開

XMLテクニック集(3):DTDで要素型宣言を定義する (1/3)

[山田祥寛,@IT]

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を構成する最も主要な宣言である「要素型宣言」についてみてみることにします。

[books_dtd.xml]
<?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文書を活用するための「基礎知識」でもあるのです。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。