エンジニアのためのXMLスキーマ講座
第3回:XMLの標準スキーマ表現 DTDを「書く」
(株)日本ユニテック
竹内 理
目次<全7ページ>
5.STEP4:エンティティ宣言、記法宣言を記述する
|
STEP4:エンティティ宣言、記法宣言を記述する
データの構造と構成要素がはっきりしたら、すぐにでも要素型宣言を書いていきたいところですが、その前に幾つか行っておくことがあります。
例えば、データの中に繰り返し同じような構造が出てこないでしょうか。もしかしたら、このような構造をそのまま要素型宣言に記述すると、なんとなく冗長な感じのDTDになってしまうかもしれません。この場合、繰り返し出てくる構造に関する記述をパラメータエンティティとして宣言しておくとよいでしょう。
また、電子メールのサンプルデータでは「資料1.file」という添付ファイルがありました。実際に電子メールデータをXML化したときには、添付ファイルをパース対象外エンティティとして文書インスタンス中で参照する必要があります。となると、「資料1.file」は先にパース対象外エンティティとして宣言する必要があります。
また、「資料1.file」はパース対象外エンティティですから、どんな記法でかかれているのかという情報も付与したいものです。ですから、その記法の宣言も行っておく必要があります。
さらに、今回は扱いませんがもしサンプルデータの中に同じテキストデータがいくつも出てくることが分かっている場合、それを内部エンティティとして宣言しておくとよいかもしれません。
ではSTEP4ではエンティティ宣言と記法宣言を行ってみましょう。
<パラメータエンティティの宣言>
まず図2をよく見ると、電子メールを構成する要素のグループの中に繰り返し出てくるものがあることにお気づきになるでしょう。それは「name」と「mail-address」の2つの要素で構成されるグループです。
例えばこのグループを含む構造をそのままDTDに記述すると、どんな感じになるでしょうか。
<!ELEMENT from (name,mail-address)>
<!ELEMENT to (name,mail-address)>
<!ELEMENT cc (name,mail-address)>
<!ELEMENT bcc (name,mail-address)>
内容モデル"name,mail-address"が4回も出てきます。これはこれで正しいのですが、普通はこのように繰り返し出てくる内容モデルを表す文字列をパラメータエンティティとして宣言し、DTD内でそのエンティティを参照するという形をとります。
では、"name,mail-address"をパラメータエンティティとして宣言しましょう。
<!ENTITY % personal-data "name,mail-address">
これで文字列を"name,mail-address"をパラメータエンティティpersonal-dataとして宣言したことになります。
<記法宣言>
この電子メールのデータには添付ファイルとして「資料1.file」というファイルを持っています。前述したようにこのファイルはDTD内でパース対象外エンティティとして宣言する必要がありますが、その前にこのファイルの記法を宣言しなければなりません。
では、「.file」というファイルの記法(架空の記法です)の宣言をしてみましょう。
<!NOTATION FILE SYSTEM "http://www.utj.com/file">
これでパース対象外エンティティの宣言でFILEという記法名が使用できるようになります。
<パース対象外エンティティの宣言>
記法を宣言したところで、次に「資料1.file」をパース対象外エンティティとして宣言してみましょう。
<!ENTITY data1 SYSTEM "http://www.utj.com/資料1.file" NDATA FILE>
これで、文書インスタンス中でENTITY型の属性値を持つ属性を使用することにより、「資料1.file」を参照することが出来るようになりました。
もちろん、添付ファイルが複数ある場合はそれらの数だけエンティティ宣言をする必要があります。
(注意)実際の業務で使用するDTDを外部サブセットとして作成する場合、各文書インスタンスに依存するようなパース対象外エンティティ(今回のサンプルでは添付ファイル)は一般的に外部サブセットの中には記述しません。それぞれの文書インスタンス中で参照する全てのパース対象外エンティティを、あらかじめ外部サブセット中に宣言することは現実的ではないからです。
そのような場合は文書インスタンス中のDOCTYPE宣言で外部サブセットを指定したのち、必要なパース対象外エンティティの宣言をDOCTYPE宣言内に記述します。例を以下に示しておきます。
<!DOCTYPE art SYSTEM "art420.dtd" [
<!ENTITY FIDinlineimage1 "inlineimage1.jpg" NDATA IMAGE>
<!ENTITY FIDinlinemath1 "inlinemath1.jpg" NDATA IMAGE>
]>
この例では、まずart420.dtdという外部サブセットを指定し、その後、同じDOCTYPE宣言内でその文書インスタンス中で参照するパース対象外エンティティを宣言しています("IMAGE"という記法名はart420.dtd内で宣言しています)。
関連サービス
XMLスキーマの策定、作成業務
|