🤔

XML の構文 <![CDATA[...]]> のルーツ

2023/07/30に公開

<![CDATA[...]]> とは

XML を扱っていると <![CDATA[...]]> という記法を見かけることがあります
例えば SmartNews 向けに記事を配信するための SmartFormat という RSS/Atom フィードの仕様では記事のコンテンツを以下のように記述することになっています

<content:encoded>
  <![CDATA[
      <p>渋谷駅桜丘口地区再開発準備組合と東急不動産株式会社は、2014年6月16日、渋谷区の市街地再開発等の都市開発計画が東京都により決定されたと発表した。</p>
      <p>この都市計画は、2013年12月19日より東京都知事に対して提案されていたもので、渋谷駅中心地区の都市基盤整備を完成させる重要なプロジェクトとなっている。</p>
      <p>今後、周辺再開発と連携した縦動線アーバン・コア、歩行者デッキ、ネットワークの整備を行うほか、街区再編と併せた都市計画道路の整備および地下車路ネットワーク等の整備により、利便性・安全性の向上を図っていくとのこと。</p>
      <figure>
          <img src="img.png">
          <figcaption>完成イメージ</figcaption>
      </figure>
  ]]>
</content:encoded>

参考

この構文自体は特に難しいことはなく、XML 内でエスケープが必要な文字列(例えば <>)を要素として使いたいときにそのまま書ける便利な構文です
<![CDATA[...]]> で囲まれた部分は XML の構文として解釈されず、文字列として扱われます

この構文は CDATA セクションと呼ばれています

不思議な構文 <![CDATA[...]]>

CDATA セクションの役割は理解できました。ではなぜこのエスケープを楽できる構文が <![CDATA[...]]> という一見奇妙な形をしているのでしょうか
もっとシンプルに <![..]> とかじゃダメだったの?とか CDATA 以外の <![XXX[...]]> という構文があるってこと?とか気になったので調べてみました

誤りがあればコメントで指摘していただけると幸いです 🙇

SGML

CDATA セクションの由来を調べていくと SGML(Standard Generalized Markup Language)というマークアップ言語にルーツを持つことが分かりました
SGML とは XML や HTML の先祖にあたるようなマークアップ言語です
SGML から使われない構文を削除したりパースが難しい構文を削除したりして、SGML と相互運用可能な状態(つまり SGML パーサーで解釈可能な状態)で仕様をシンプルにしたものが XML です

参考

SGML の <![CDATA[...]]>

お察しの通り <!CDATA[...]] は SGML に存在していた構文です
SGML の CDATA セクションも XML と同様で、この構文内の文字列は SGML として解釈されないことを意味します
<![XXX[...]]> のような構文は SGML で Marked Section と呼ばれており、CDATA 以外にも以下のような Marked Section があります

<![INCLUDE[
  <!-- this will be included -->
]]>
<![IGNORE[
  <!-- this will be ignored -->
]]>

参考

まとめ

以上が ![CDATA[...]] 構文のルーツでした

  • XML は SGML と相互運用が可能な状態を目指して設計されたマークアップ言語
  • ![CDATA[...]] は SGML に由来する構文
  • CDATA 以外にもいくつか Marked Section が存在する

Discussion