HTMLと同じくXMLも山括弧とアンパサンドをタグの区切りに使うため、これらの記号はテキスト内容にそのまま書くことができない — 書いてしまうと文書は妥当なXMLではなくなり、ブラウザが壊れたHTMLを大目に見て表示するのとは違って、XMLパーサーはエラーで処理を止める。
必須の5つのエンティティ
HTMLには数百の名前付きエンティティがあるが、XML仕様が必須とするのは次の5つだけだ。
<—<の代わり>—>の代わり&—&の代わり'— シングルクォート'の代わり"— ダブルクォート"の代わり
クォートは属性値の中でのみエスケープが必須で、<と&はテキスト内容のどこにあってもエスケープが必要になる。
実際にどこで使われているか
EPUB形式の電子書籍はXMLベースの構造を持ち、書名や著者名に&が含まれる場合はエスケープしないとファイル全体が壊れる。同じ問題はニュースサイトのRSSフィードでも起こる — 見出しに未エスケープの&が1つあるだけで、購読者のフィードリーダー側でフィード全体の読み込みが失敗する。
XMLがHTMLより厳格な理由
ブラウザは壊れたHTMLでもたいてい大目に見て、エラーがあってもページを表示しようとする。XMLパーサーはそうしない — エスケープされていないアンパサンドや山括弧が1つあるだけで文書全体が無効になり、処理はエラーで停止する。
こういうときに使う
- XML文書(フィード、設定ファイル、SOAPメッセージ)に挿入する前にユーザー入力のテキストを準備するとき。
- デバッグ:受け取ったXMLのエンティティの背後にある元のテキストを確認するとき。
- 文書構造を壊さずにXMLファイルを手動で編集するとき。
エンティティの代替:CDATAセクション
テキストブロックに特殊文字が多く含まれる場合 — XMLの中に埋め込まれたHTMLやコードの断片など — <![CDATA[...]]>で囲む方が扱いやすい。このセクション内では<と&をエスケープする必要がなく、そのままのテキストとして扱われる。唯一の例外は]]>という並びで、これはCDATAセクションを閉じる記号のため、セクション内容そのものに含めることはできない。