CDATAセクションは書く必要があるのか

4 min read

背景

レガシープロジェクトを改修中にCDATAに遭遇した。

CDATAは必要なんですか」と訊かれ、「プロダクトの仕様上は必要ない」と返答したことがあった。
また、別のレガシープロジェクトでCDATAに遭遇した際は「(プロダクトの仕様上)必要だ」と返答した。

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

端的に述べるとケースバイケースである。

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

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

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

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

参考