XML > XML > 実体宣言(entity declaration)
実体宣言の概要
XML 文書中に同じ文字列が繰り返される場合や XML を複数ファイルで管理する場合、
文字列を登録しておいて置換文字列として参照したり、ファイルとして参照したりすることがあり、
この時の文字列やファイルのように、XML 文書の一部となるデータを格納しているものを実体(entity)と言う。
XML の書式に沿っているテキストファイル以外(バイナリファイルなど)でも、
XML 文書で使用するのであれば実体として扱うことが出来る。
DTD 内で実体を定義することを実体宣言と言い、XML インスタンス内で実体を挿入する部分を実体参照と言う。
実体は実体宣言で宣言し、実体参照で参照される。
実体の分類
実体は3通りの分類があり、それぞれ以下のように分けられる。
分類 | 内容 |
---|---|
一般実体(general entity) | XML インスタンス内で参照される |
パラメタ実体(parameter entity) | DTD 内部で参照される |
分類 | 内容 |
内部実体(internal entity) | 宣言の内部に内容を書き込む |
外部実体(external entity) | 外部に存在するリソースを参照 |
分類 | 内容 |
解析対象実体(parsed entity) | 内容が XML の書式に従ったテキスト |
解析対象外実体(unparsed entity) | 内容が XML の書式に従っていないもの (バイナリデータなども可) |
また、それぞれ以下のような関係になる。
一般実体 | 内部実体 | 解析対象実体 |
外部実体 | 解析対象実体 | |
解析対象外実体 | ||
パラメタ実体 | 内部実体 | 解析対象実体 |
外部実体 | 解析対象実体 |
テキスト宣言
外部実体かつ解析対象実体の場合、参照される外部ファイルには文字コードを
テキスト宣言で指定する必要がある。
(書式) <?xml version="バージョン" encoding="エンコード方式"?> |
XML 宣言と違い、version 属性が省略可能で encoding 属性が必須となる。
また、エンコードが UTF-8,UTF-16 の場合はテキスト宣言は不要となる。
実体参照(entity reference)
実体参照の方法は上記の分類によって異なる。
一般実体かつ解析対象実体 &実体名; 解析対象外実体 実体名 パラメタ実体 %実体名; |
実体宣言:一般実体かつ内部実体
(書式) <!ENTITY 実体名 "置換文字列"> (例) 宣言 <!ENTITY COUNTRY "Japan"> XML <社員名簿> <社員 国籍="&COUNTRY;">山田太郎</社員> <社員 国籍="&COUNTRY;">鈴木花子</社員> </社員名簿> XML解析結果 <社員名簿> <社員 国籍="Japan">山田太郎</社員> <社員 国籍="Japan">鈴木花子</社員> </社員名簿> |
実体宣言:一般実体かつ外部実体かつ解析対象実体
(書式) <!ENTITY 実体名 SYSTEM "外部実体ファイルのURI"> <!ENTITY 実体名 PUBLIC "公開識別子名" "外部実体ファイルのURI"> (備考) 公開識別子名の詳細 承認有無//所有者名//文書種類//ISO639言語識別子 ・承認有無 標準化団体が承認している場合は + 、承認していない場合は - ・所有者名 文書の所有者名や組織名 ・文書種類 文書の種類 ・ISO639言語識別子 内容を記述している言語 (例) 宣言 <!ENTITY REFDATA SYSTEM "REF.XML"> XML <社員名簿> <社員>山田太郎</社員> <社員>鈴木花子</社員> &REFDATA; </社員名簿> REF.XML <?XML version="1.0" encoding="Shift_JIS"?> <社員>斉藤一郎</社員> XML解析結果 <社員名簿> <社員>山田太郎</社員> <社員>鈴木花子</社員> <社員>斉藤一郎</社員> </社員名簿> (注意) 参照する外部ファイルには文字エンコーディングを指定する必要がある |
実体宣言:一般実体かつ外部実体かつ解析対象外実体
(書式) <!ENTITY 実体名 SYSTEM "外部実体ファイルのURI" NDATA 記法名> (注意)記法名は記法宣言を参照 (例) 宣言 <!ENTITY REFDATA SYSTEM "REF.JPG" NDATA JPEG> XML <社員> <氏名>山田太郎<氏名> <img src="REFDATA" /> </社員> |
実体宣言:パラメータ実体かつ内部実体
(書式) <!ENTITY % 実体名 "置換文字列"> |
実体宣言:パラメタ実体かつ外部実体
(書式) <!ENTITY % 実体名 SYSTEM "外部実体ファイルのURI"> <!ENTITY % 実体名 PUBLIC "公開識別子名" "外部実体ファイルのURI"> |
実体宣言の注意事項
・同じ実体名を重複して宣言した場合には、先に宣言したものが有効になる
・同じ実体名を内部実体と外部実体で重複して宣言した場合には内部実体の宣言が有効になる
・同じ実体名を一般実体とパラメタ実体で重複して宣言可能(両方とも有効)