すべての記事

XML Entities:XML文書内の文字をエスケープする

HTMLと同じくXMLも山括弧とアンパサンドをタグの区切りに使うため、これらの記号はテキスト内容にそのまま書くことができない — 書いてしまうと文書は妥当なXMLではなくなり、ブラウザが壊れたHTMLを大目に見て表示するのとは違って、XMLパーサーはエラーで処理を止める。

必須の5つのエンティティ

HTMLには数百の名前付きエンティティがあるが、XML仕様が必須とするのは次の5つだけだ。

  • &lt;<の代わり
  • &gt;>の代わり
  • &amp;&の代わり
  • &apos; — シングルクォート'の代わり
  • &quot; — ダブルクォート"の代わり

クォートは属性値の中でのみエスケープが必須で、<&はテキスト内容のどこにあってもエスケープが必要になる。

実際にどこで使われているか

EPUB形式の電子書籍はXMLベースの構造を持ち、書名や著者名に&が含まれる場合はエスケープしないとファイル全体が壊れる。同じ問題はニュースサイトのRSSフィードでも起こる — 見出しに未エスケープの&が1つあるだけで、購読者のフィードリーダー側でフィード全体の読み込みが失敗する。

XMLがHTMLより厳格な理由

ブラウザは壊れたHTMLでもたいてい大目に見て、エラーがあってもページを表示しようとする。XMLパーサーはそうしない — エスケープされていないアンパサンドや山括弧が1つあるだけで文書全体が無効になり、処理はエラーで停止する。

こういうときに使う

  • XML文書(フィード、設定ファイル、SOAPメッセージ)に挿入する前にユーザー入力のテキストを準備するとき。
  • デバッグ:受け取ったXMLのエンティティの背後にある元のテキストを確認するとき。
  • 文書構造を壊さずにXMLファイルを手動で編集するとき。

エンティティの代替:CDATAセクション

テキストブロックに特殊文字が多く含まれる場合 — XMLの中に埋め込まれたHTMLやコードの断片など — <![CDATA[...]]>で囲む方が扱いやすい。このセクション内では<&をエスケープする必要がなく、そのままのテキストとして扱われる。唯一の例外は]]>という並びで、これはCDATAセクションを閉じる記号のため、セクション内容そのものに含めることはできない。

ツールを試す