背景

レガシープロジェクトを改修中にCDATAに遭遇した。新卒に「CDATAは必要なんですか」と訊かれ、「プロダクトの仕様上は必要ない」と返答した。

また別のレガシープロジェクトでCDATAに遭遇した。別の子に「CDATAは必要ですか?」と訊かれ、「(プロダクトの仕様上)必要です」と返答した。

今後、モダンな開発をしていく中ではCDATAを新規で追加することは恐らく皆無だろうが、どういったケースで必要になるのか記載をしておく。

結論を述べると前述のようにケースバイケースで必要になってくる。

そもそもCDATAセクションとは

CDATAセクションは、XML文書内で使用される。

XML内で<, >を文字列として表現するときは、問題なくパースできるように実体参照(&gt;, &lt;)で記述しなければならない。

実体参照で記載する文字が少なければ良いが、大量だと記載の仕分けや管理が大変になってくるため、プレーンな状態で記載を行いたい場合も多い。そういった記述をする際にCDATAセクションを使用する。

<document>
  <![CDATA[
    1 < 10
  ]]>
</document>

上記のように記述することで、タグではなく文字列として扱うことができる。
※ ただし、CDATAセクション内でも ]]> はCDATAセクションの終了を示すものを解釈され扱うことはできない。

現代でのCDATAセクションの扱い

拡張子が*.htmlでHTML5宣言をしているのであれば、CDATAセクションは不要である。(XHTML5みたいな書き方の場合は必要だろうが…)

大抵の場合、CDATAが必要なのはファイル拡張子が*.xhtmlになっているものだろう。XHTMLでも<script>,<style>をインラインで使用は可能だが、HTMLとの扱いとは少々異なり、CDATAセクションが必要となる。

<script>
//<![CDATA[
  alert('hoge');
//]]>
</script>

<![CDATA[ 〜 ]]>をそのままの記述で正しく認識しないブラウザもあるため、CDATAセクションの開始・終了部分を単一行のコメントアウトするのが一般的である。
これらの要素については、外部ファイルとして読み込めばCDATAセクションを意識する必要もなくなる。

インラインスクリプト内の<!-- //-->とは(余談)

下記のようにCDATAとともに謎のコメント記述を見かけることがあるだろう。

<script>
<!--
   alert('hoge');
//-->
</script>

スクリプト内に記載された<!--, -->はどういう意味があるのかというと、これはJavaScriptに対応していないブラウザが<script>内の記述をそのまま画面上に表示させてしまうのを防ぐための対応である。
JavaScriptをオフにしているではなく、そもそもJavaScriptに対応していないブラウザは現在では主要なブラウザにおいて存在しないので、今はあえて記載しなくて良い。

まとめ

例えモダンなプロダクトだろうが、バックエンド側がXMLをパースする必要がある場合は、このCDATAセクションが必要な場合もある。

参考