XMLの基本 6章 エンティティ宣言
- 6.1 エンティティ
- 6.2 内部エンティティ
- 6.3 外部エンティティ
- 6.4 エンティティ宣言に関する注意
- 6.5 解析対象外エンティティとNOTATION宣言
- 6.6 パラメーターエンティティ
- 6.7 まとめ
- (参考1) standalone文書
- (参考2) 他のスキーマ言語
6.4 エンティティ宣言に関する注意
ここでは、内部、外部にかかわらず、エンティティを宣言する際に注意する点について、記述します。
- エンティティ名に使用できる文字
エンティティ名に使用できる文字は、要素名や属性名に使用できる文字と同じです。詳細は、2章「要素と属性に使用できる文字」を参照ください)。
- 重複したエンティティ宣言
重複して同じエンティティを宣言した場合は、先に記述されているエンティティ宣言が優先されます。例えば、DTD内に以下のような記述があったとします。<!ENTITY header SYSTEM "http://www.4dd.co.jp/header"> <!ENTITY header "<head></head>">
上の場合、XMLプロセッサは、headerエンティティは、外部ファイルheaderであるとして処理をします。
- エンティティ内のタグ
エンティティ内のタグの構文には、制約があります。まず、同じ要素に対する開始タグと終了タグは同一のエンティティ内に存在する必要があります。以下に例を示します。<manual> &chapter1; &chapter2; &chapter3; </manual>
上のように、外部エンティティ参照を記述した場合、各エンティティは以下の例のように開始タグ、終了タグを両方含むような構成になっている必要があります。
<chapter num="1" > これは第一章です。 ... </chapter>
(chapter1エンティティの例)
<chapter num="2" > これは第二章です。 ... </chapter>
(chapter2エンティティの例)
各エンティティの内容が下記のように、開始タグあるいは、終了タグしか含まないような場合はエラーになります。
<chapter num="1" > これは第一章です。 ...
(chapter1エンティティの悪い例)
</chapter> <chapter num="2" > これは第二章です。 ... </chapter>
(chapter2エンティティの悪い例)
以上、例では外部エンティティで説明しましたが、もちろん、内部エンティティについても当てはまります。
また、XML文書中のルート要素は必ず、文書エンティティに存在する必要があります。
<?xml version="1.0"> <!DOCTYPE root [ <!ELEMENT root EMPTY> <!ENTITY root "<root/>"> ]> &root;
以上の文章は、ルート要素が文書エンティティ内ではなく、内部エンティティ内にあるためエラーになります。
- 属性値の中のエンティティ参照
文書内のテキストと同じように、属性値の中でエンティティの参照を行うことができます。<!ENTITY CompanyName ゛Four-Dimensional Data, Inc "> <!ATTLIST File Copyright CDATA #IMPLIED> ... <File Copyright="Copyright (C) 2001. &CompanyName;. All Rights Reserved. "> ...
以上の例では、Copyrightの属性値は"Copyright (C) 2001.Four-Dimensional Data, Inc . All Rights Reserved. "として処理されます。属性値内で使用できるエンティティは、内部エンティティである必要があり、外部エンティティは使用できません。