DTD の書き方 - DTD - XML プログラミング

PROGRAM


DTD の書き方

XML では、DTD や XML スキーマを使って、文書の構造を定義できるようになっています。

ここでは、DTD を使って文書の構造を定義する方法について見ていきます。XML スキーマで構造を定義する方法については XML スキーマの書き方 を参考にしてください。

 

ここで作成した DTD ファイルは、XML ファイルに読み込むことで、DTD で定義した内容とその XML の内容とを関連付けることができます。

DTD ファイルを XML に適用する方法については DTD を XML 文書に取り込む に記します。

書き方の基本

DTD ファイルの基本的な書き方について整理すると、内容としては <!DOCTYPE> タグ内の [ ] 内の内容を、別ファイルに記載する感じになります。

<!ELEMENT 基本情報 (サイト, 著作権)>

<!ELEMENT サイト (#PCDATA)>

<!ELEMENT 著作権 (#PCDATA)>

<!ATTLIST サイト URL CDATA #REQUIRED>

このような感じで、DTD を記載して行きます。

データ型

DTD には、データ型と言って良いのか、要素の定義 (!ELEMENT) で使用可能な表現には、次のものがあるようです。

#PCDATA 文字列を意味します。
EMPTY 空の要素を意味します。
ANY DTD 内の任意の要素を意味します。

また、属性の定義 (!ATTRIBUTE) では、次のものを指定できるようでした。

CDATA 文字列を意味します。
ID 一意の識別子を意味します。属性ごとではなく、文書全体で一意である必要があるようです。
IDREF ID の参照を意味します。文書内の ID 属性に登場した値を設定することになります。
IDREFS IDREF を半角スペースを挟んで連結した文字列を意味します。
NMTOKEN 名前トークン(要素名やタグ名として使用できる文字列)を意味します。
NMTOKENS NMTOKEN を半角スペースを挟んで連結した文字列を意味します。
ENTITY 実体参照として定義された文字列を意味します。
ENTITIES ENTITY を半角スペースを挟んで連結した文字列を意味します。

このようなデータ型を指定して、構文を定義して行く形になります。

このように DTD では、要素や文字列かといった程度しか表現できないので、整数や小数点数といった細かい定義をしたい場合には XML スキーマ を利用しなくてはいけなくなります。

要素を定義する

DTD では、要素を <!ELEMENT> タグで定義します。

<!ELEMENT 基本情報 (サイト, 著作権)>

たとえばこのようにすることで、"<サイト>" と "<著作権>" の 2 つの要素を持つ "<基本情報>" という要素を定義することができました。

 

ここで、要素名に続いて括弧 ( ) で、その要素が持つ子要素の名前を指定しています。

ここではカンマ ( , ) を使って並べているので、これらの要素がこの順番で登場するという定義になります。

どちらかが登場するとしたい場合には、カンマではなくパイプ ( | ) を使って定義します。

 

括弧の中に記した要素名は、同じように <!ELEMENT> タグを使って定義します。

<!ELEMENT サイト (#PCDATA)>

今回の例では、括弧の中が "#PCDATA" になっていますが、この場合は要素が内側に、子要素ではなく文字列を持つことを示しています。

要素に属性を持たせる

DTD で要素に属性を持たせたい場合には <!ATTLIST> タグで定義します。

たとえば先ほどの <基本情報> 要素に "種類" 属性を持たせて <基本情報 種類=""> というような使い方をしたい場合には、次のように記載します。

<!ATTLIST 基本情報 種類 CDATA #REQUIRED>

このようにすることで、要素 <基本情報> の属性として "種類" を定義することができます。

 

ここではデータ型として "CDATA" を指定しているので、属性値は文字列で指定することと定義しています。

また、その後の "#REQUIRED" のところでは、この属性を必ず指定する必要があるということを示しています。

属性の指定を任意としたい場合には、ここを "#IMPLIED" とします。このとき、その後に空白を挟んで、省略時の規定値を定義することも可能です。

他にも "#FIXED" という指定があって、この後に続けて属性値を指定することで、その属性は必ずここで指定された値である必要があることを意味します。

要素の登場頻度を定義する

DTD では、要素名の直後に記号を付けて、要素の登場頻度を定義します。

登場回数を指定する場所は <!ELEMENT> タグ内の括弧で指定する要素のところで、ここで指定する要素名に、次の記号をつけることで指定します。

  何も指定しない場合は、その要素が 1 つ登場することを意味します。
? 要素が 0 つまたは 1 つ登場することを意味します。
* 要素が 0 つ以上、登場することを意味します。
+ 要素が 1 つ以上、登場することを意味します。

例えば、要素 <ショップ一覧> が任意の数の <ショップ> 要素を持つ場合には、次のような定義になります。

<!ELEMENT ショップ一覧 (ショップ*)>

カンマなどで区切られて複数の要素が定義されている場合には、それぞれの要素について、これらの記号を使って登場頻度を定義することが可能です。


[ もどる ]