XMLエンティティ参照 — 定義済み、数値、カスタムエンティティ
XMLエンティティ参照をマスターします:5つの定義済みエンティティ、数値文字参照、DTDでのカスタムエンティティ宣言、XMLパースとフォーマット中のエンティティ解決方法を解説します。
詳細な説明
XMLエンティティ参照
XMLエンティティは、パース中に定義された値に置き換えられるプレースホルダーです。特殊文字、再利用可能なテキストフラグメント、外部コンテンツをXMLドキュメントに含めるために不可欠です。
5つの定義済みエンティティ
XMLは常に利用可能な5つの組み込みエンティティを正確に定義しています:
| エンティティ | 文字 | 説明 |
|---|---|---|
< |
< |
小なり記号 |
> |
> |
大なり記号 |
& |
& |
アンパサンド |
" |
" |
ダブルクォート |
' |
' |
アポストロフィ |
これらのエンティティは、リテラル文字がXMLマークアップとして誤解釈される場合に使用しなければなりません。例えば、テキストコンテンツ内の < は < と書く必要があります。
数値文字参照
任意のUnicode文字を数値参照で含めることができます:
- 10進数:
©は著作権記号を生成 - 16進数:
©は同じ文字を生成 - 絵文字:
😀はにっこり顔の絵文字を生成
数値参照は、キーボードで入力できない文字やドキュメントのエンコーディングでサポートされていない文字に有用です。
カスタムエンティティ(DTD)
Document Type Definitionでカスタムエンティティを定義できます:
<!DOCTYPE document [
<!ENTITY company "Acme Corporation">
<!ENTITY copyright "© 2024 Acme Corporation. All rights reserved.">
]>
<document>
<header>&company; - Confidential</header>
<footer>©right;</footer>
</document>
カスタムエンティティはテキストマクロのように機能します。各 &company; 参照はパース中に完全なテキストに展開されます。
外部エンティティ
外部エンティティは外部ファイルやURLからコンテンツを参照します:
<!ENTITY chapter1 SYSTEM "chapter1.xml">
セキュリティ警告: 外部エンティティはXXE(XML External Entity)攻撃で悪用される可能性があります。ほとんどの現代パーサーはデフォルトで外部エンティティの解決を無効にしています。
パラメータエンティティ
DTD内でのみ使用され、パラメータエンティティ(% で宣言)はDTDフラグメントの再利用を可能にします:
<!ENTITY % common-attrs "id ID #IMPLIED class CDATA #IMPLIED">
<!ELEMENT item (#PCDATA)>
<!ATTLIST item %common-attrs;>
フォーマットの考慮事項
XMLをフォーマットする際、エンティティ参照はそのまま保持されるべきです。フォーマッターはエンティティを展開すべきではなく(< を < に置き換えるとドキュメントが壊れる)、リテラル文字が有効な場所に新しいエンティティを導入すべきでもありません。
ユースケース
XMLエンティティの理解は、特殊文字を含むXMLデータ(国際化コンテンツ、数学的式、法的記号)の処理、XMLドキュメントのプログラム的構築、XXE攻撃に対するXMLパーサーのセキュリティ確保、出版やドキュメント管理システムでのDTD検証済みXMLでの作業に不可欠です。