内部実体


実体

XML において、XML 文書が参照する源泉のことを実体と呼びます
実体は、ファイルであったり、データベースのレコードでもかまいません
XML 文書の特定の部分を含むデータを「実体」と呼ぶことができると考えられます

XML ファイルの宣言やルート要素などの記憶単位を文書実体と呼びます
実体は実体参照によって、XML 文書に読み込まれます
XML パーサが読み込む文書実体は、実体参照を含むこともあり
XML パーサは、参照されている実体を読み込み、1つの文書とします

実体参照を用いれば、文書は単独として完成する必要はありません
複数の文書が、固有の実体を参照することによって整合性を保つこともできます

実体は、さらに内部実体外部実体に分けられます
内部実体とは文書実体内で定義される実体のことを表し
先ほど説明したように、文書も実体なので XML 文書は1つ以上の内部実体を持ちます

外部実体とは、URL 等を参照して見つける他のソースから取りこむものをさし
例えば、HTML の IMG タグなどは、外部実体参照と呼ぶことができるでしょう
今回は、このうち「内部実体」に着目して解説します


内部一般実体

内部一般実体は DTD に実体を宣言して、文書実体で参照します
以前 XML 編で解説した、定義済みの実体参照も内部実体と考えられます
XML では、任意のテキストを独自の実体として定義することができます

頻繁に用いる文章や URL 等に対しては、実体参照は強力な機能です
例えば、あなたの文書が7箇所も Microsoft のサイトへのリンクを含んでいる場合
Microsoft が URL を変更すれば、全ての A 要素のアドレスを変えなければいけません
ところが、実体参照を用いればこのような苦労はなくなります
DTD に Microsoft のアドレスを記述し、文書実体でこれを参照すれば良いのです
そうすれば DTD に書かれている URL を変えれば、文書のリンク先は全て影響されます

内部一般実体は、DTD で <!ENTITY> を用いて定義します
ENTITY キーワードの次に実体名を、その次に置換えテキストを指定します

<!ENTITY 実体名 "置換えテキスト">

文書実体から参照するには &実体名; と記述します
そうすると、指定した実体名の置換えテキストを文書のその場に挿入するでしょう
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE object [
	<!ENTITY KITTY "Kitty on your lap">
	<!ELEMENT object (#PCDATA)>
]>

<object>
	&KITTY; : &KITTY;
</object>
サンプルを見る

サンプルを見れば、実体参照が置換え文字に変換されていることがわかります
実体は、単純に文字列を文書に貼りつけるだけであり、それ以外の制限はありません
実体にタグなどを含め、それを文書でタグとして扱わせることも可能です
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE object [
	<!ENTITY KITTY "<title>Kitty on your lap</title>">
	<!ELEMENT object (title)>
	<!ELEMENT title (#PCDATA)>
]>

<object>
	&KITTY;
</object>
サンプルを見る

この文書は、妥当な文書です
&Kitty; 実体参照が、DTD の実体をその位置に置き換えるため
XML パーサは <title> タグを認識するでしょう

さらに、内部一般実体では次のようなことも可能としています
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE object [
	<!ENTITY TARUTO "Magical nyan nyan TARUTO">
	<!ENTITY KITTY "Kitty on your lap : &TARUTO;">
	<!ELEMENT object (#PCDATA)>
]>

<object>
	&KITTY;
</object>
サンプルを見る

実体 KITTY は、実体 TARUTO を含んでいます
TARUTO を単独で参照できる事はもちろんのこと、KITTY を参照すると
KITTY から、さらに TARUTO が参照され、最終的に文書内容の一部となります

ただし、実体型の実体に依存する場合、それらは巡回してはなりません
上の文書の場合、実体 TARUTO のテキストが KITTY を参照した場合、循環してしまいます



前のページへ戻る次のページへ