データのメンテナンスなどを考えると、大きな1つのXML文書をいくつかに分割したいときがあります。DTDの機能である実体参照宣言を利用すると、1つのXML文書を複数に分割できます。
カテゴリ | DTD | |
関連要素 | <!DOCTYPE>、<!ENTITY> | |
関連記事 | document関数で細分化されたXML文書を結合する | |
XML文書はテキストエディタなどで簡単にデータを追加できる分、1つのXML文書が大きなものになりがちです。しかし、メンテナンスのしやすさ、ドキュメント(データ)の再利用性という観点から見たとき、極力、個々のデータ単位を小さくしておいた方が有利なケースが少なくありません。
そこでここでは、DTD(Document Type Definition)の「実体参照宣言」を利用して、「DTDで属性リスト宣言を定義する」で使用したbooks.xmlを、<book>要素単位に分割する方法を解説しましょう。
「実体参照」とはその名のとおり、あらかじめ指定された文字列や外部ファイル(このようなリソース全般のことを「実体」といいます)を参照することをいいます。実体参照を用いることによって、XML文書中で共通に使用するリソースの使い回しなどがよりスマートに記述できるようになります。
それでは、具体的な例をみてみることにしましょう。下記が、実体参照を用いた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)> <!ATTLIST book isbn CDATA #REQUIRED> <!ENTITY book1 SYSTEM "book1.xml"> <!ENTITY book2 SYSTEM "book2.xml"> <!ENTITY book3 SYSTEM "book3.xml"> <!ENTITY book4 SYSTEM "book4.xml"> <!ENTITY book5 SYSTEM "book5.xml"> <!ENTITY srv "サーバーサイド技術"> ]> <books name="書籍情報一覧"> &book1; &book2; &book3; &book4; &book5; </books>
book_depart.xmlの中に記述されたDTDの以下の部分に注目してみましょう。
<!ENTITY book1 SYSTEM "book1.xml"> <!ENTITY book2 SYSTEM "book2.xml"> <!ENTITY book3 SYSTEM "book3.xml"> <!ENTITY book4 SYSTEM "book4.xml"> <!ENTITY book5 SYSTEM "book5.xml">
外部ファイルを参照する実体参照宣言の場合、
の形式で記述します。実体名は、XML文書内で「実体」を参照する際に使用する名前を示しますので、同一のXML文書内で必ず一意な名前でなければなりません。
このように宣言された「実体」は、XML文書中からそれぞれ以下のように参照することが可能です。
&book1; &book2; &book3; &book4; &book5;
「&実体名;」の形式で示された実体参照は、まさにこの部分にあらかじめ指定された実体(ファイル)が埋め込まれるイメージだと思っておけばよいでしょう。「&book1;」の部分には、対応するbook1.xmlがインクルードされます。
<?xml version="1.0" encoding="Shift_JIS" ?> <book isbn="ISBN4-7981-0189-3"> <title>10日でおぼえるJSP/サーブレット入門教室</title> <author>Y.Yamada</author> <published>翔泳社</published> <price>2800</price> <publishDate>2002/05/17</publishDate> <description>&srv;の雄「<keywd>JSP/サーブレット</keywd>」をJava初心者でもわかる10日間のセミナー形式で紹介。</description> </book>
上記がbook1.xmlの例ですが、こうして実体参照によって複数のXML文書を下記のようにまとめることができます。
なお、実体参照によって呼び出される外部ファイルにも<?xml ?>宣言を付加しなければならない点に注意してください。分割された側のファイル内で2バイト文字が使用されている場合、<?xml ?>宣言で正しい文字エンコーディング名が指定されていないと、文字化けなど、XML文書が正しく処理されない場合があります。また、呼び出し元と呼び出される先で使用される文字コードは、一致していなければなりません。
実体参照は、外部ファイルの呼び出しのみに使用できるわけではありません。以下の例のように、XML文書内で共通に使用される文字列リソースを一元的に管理したいという場合にも使用可能です。
<!ENTITY srv "サーバーサイド技術">
実体参照を使用することで、XML文書内のデータ内容に変更が発生した場合でも影響する範囲を小さくすることができ、メンテナンス時のミスや手間を減らすことが可能になります。
Copyright © ITmedia, Inc. All Rights Reserved.