外部サブセットを利用して、DTDをXML文書から分離する
DTDをXML文書に埋め込まず、外部ファイルに記述する「外部サブセット」について説明します。こうすることで、複数のXML文書を1つのDTDで定義できるようになります。
カテゴリ | DTD | |
関連要素 | <!DOCTYPE> | |
関連記事 | DTDで要素型宣言を定義する、DTDで属性リスト宣言を定義する |
XML文書本体に直接、文書型宣言(DTD)を埋め込む方式を「内部サブセット」というのに対して、DTDだけを外部ファイルとして扱う方式を「外部サブセット」といいます。外部サブセットの拡張子は、慣例的に「.dtd」とします。
その性質上、DTDは外部サブセットとして記述されるのが一般的です。DTDとは、複数のXML文書を交換する際に、その様式を統一するための規格を明示するのが本来の目的だからです。
一般的には外部サブセットで標準的な(統一的な)構成を定義しておき、内部サブセットでは各XML文書固有の拡張要素や実体宣言などを記述します。ちなみに、外部サブセットと内部サブセットとが競合した場合には、内部サブセットが優先されます。
(1)DTDの「外部サブセット」記述例
それでは以下に、外部サブセットとして記述したDTDの例を挙げてみることにしましょう。
<?xml version="1.0" encoding="Shift_JIS" ?> <!DOCTYPE books SYSTEM "books.dtd"> <books name="書籍情報一覧"> <book isbn="ISBN4-7983-0189-3"> <title>10日でおぼえるJSP/サーブレット入門教室</title> <author>Y.Yamada</author> <published>翔泳社</published> <price>2800</price> <publishDate>2002/05/17</publishDate> <description>サーバーサイド技術の雄「<keyword>JSP/サーブレット</keyword>」をJava初心者でも分かる10日間のセミナー形式で紹介。</description> </book> …中略… < /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)> <!ATTLIST book isbn CDATA #REQUIRED>
DTDに関する詳細は別稿「DTDで要素型宣言を定義する」や「DTDで属性リスト宣言を定義する」を参照していただくとして、ここでは外部サブセット特有の書式に注目してみましょう。
(2)外部サブセットの書式
外部サブセットの書式といっても、それほど大きな違いはありません。内部サブセットではXML文書の本体に直接記述していた以下の内容が、
<!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)> <!ATTLIST book isbn CDATA #REQUIRED> ]>
外部サブセットでは、XML文書に記述するのは参照するファイルのURL(URI)のみになります。
<!DOCTYPE books SYSTEM "books.dtd">
内部サブセットで“[ ”から“] ”の中に記述していた部分は、books.dtdにそのまま記述されている点に注目してください。外部サブセットのDTDでは、<!DOCTYPE>宣言自体を記述する必要はありません。考え方としては、元のXML文書内に記述された<!DOCTYPE>宣言の中に外部サブセットのDTDがそのまま挿入されるイメージです。
(3)公開識別子を呼び出す
なお、外部サブセットは直接URL(URI)を指定する以外にも、「公開識別子」(Public Identifier)を介して呼び出すことが可能です。公開識別子はある特定の標準化団体・業界などで策定されたDTDを参照するための識別子で、以下のような書式から構成されます。
[+|-]//{組織名|ISBN番号}//{DTD|ENTITY}//言語コード
最初の“+|-”はなんらかの公式な機関によって定められたものか(+)、一部業界内でのローカルな取り決めか(-)を判別します。後続の文字列がISBN番号である場合には、省略可能です。さらにその後の文字列は、外部サブセットが文書型宣言(DTD)であるか、実体宣言(ENTITY)であるかを識別します。実体宣言とは、いわゆるその業界内でのキーワードを集約して定義したものです。そして最後に、日本語(ja)や英語(en)などの言語コードを記述します。
公開識別子として記述した場合、XML文書内のDTD宣言は以下のようになります。
<!DOCTYPE books PUBLIC "-//Yoshihiro Yamada//DTD//JA" "http://localhost/dtd/books.dtd">
上の例の場合、公開識別子で指定されたDTDを参照しますが、もし公開識別子でDTDが特定できない場合には、後続のURLを参照します。
Copyright © ITmedia, Inc. All Rights Reserved.