So-net無料ブログ作成

XMLのCDATAセクションに]]>を書く方法 [戯言]

XMLには CDATAセクションという機能(?)を持っています。
どういうものかと言うと、< や > などをエスケープ(実体参照)しないでそのまま書けるという仕組みです。
方法は <![CDATA[]]> で囲むだけ。

例えば、こんな感じ。

<sample>
<![CDATA[<や>や&や"がそのまま書ける]]>
</sample>

これを CDATAセクションを使わないで書くと、こうなります。

<sample>
&lt;や&gt;や&amp;や&quot;がそのまま書ける
</sample>

さて、
CDATAセクションの中に ]]> を含めたい場合はどうしたら良いでしょう。

<![CDATA[あ]]>い]]>

これはNGです。

XMLとしては、1つめ ]]> までがCDATAセクションとして解釈します。


この解決方法として面白い主張をしている人がいました。

]]>> を &gt; に置き換えるというものです。
(注:コレ↑は嘘情報です)

こういうことらしい

  1. <![CDATA[あ]]>い]]>と書いたらエラーになった。
  2. <![CDATA[あ]]&gt;い]]> と書くとエラーにならない。これが正解だ。
  3. XMLパーサは、値として『 あ]]&gt;い 』を返すが、これはパーサが腐っている所為だ。

それはひょっとして
ギャグでいってるのか?
      / ̄` ̄ ̄
     / /ii、
  __ イ// 丶丶
-=ニ三三ミV=ィヾニ=-\
 /   Yェ》"乏ェ>
`/    i/
(_//、__ノ |`=   U
|ェ》乏ェx |f二丶
|/   ̄  ヽ ̄
|`=丶  U  \__/
|<三丶   〈 ヽ_/
ヽ   //丶i
 >―´/  /
―\|-〈   / O

XMLの仕様書に、きちんと書いてあります。

CData ::= (Char* - (Char* ']]>' Char*)) 

CDATAセクション内に書けるのは、]]> を含まない文字列だと。

どんなテクニックを使っても、1つのCDATAセクションの中には ]]> は書けません。絶対に。
もし書けたとしたら、それこそ、そのXMLパーサが腐っているのです。

どうしてもCDATAセクションを使って ]]> を表現したいのなら、]]>を2つに分割して、2つのCDATAセクションで表現することになります。

<![CDATA[あ]]]]><![CDATA[>い]]>

正直、めんどい。むしろCDATAセクションを使わずに書いた方が、まだ楽です。


ところで、

『CDATAセクションに ]]> を書くには >&gt; と書いたら良い』(コレ←は嘘情報です)と思っている人が結構います。

最初に誰かが言い出したことをそのまま鵜呑みにして信じてしまい、それを広めてしまったのか……

……とも思ったのですが、どうやら仕様書の書き方にも原因がありそうです。
特に、この部分が。

they need not (and cannot) be escaped using " &lt; " and " &amp; "

これを「< と & は、エスケープの必要がない」と訳し、「< と & 以外は、エスケープが必要なのかっ!」と解釈した日本人が沢山いたことでしょう。
そして、この文章だけ見せられたら、多分自分も同じ解釈をします。
(この場合の and は「と」じゃなくて「や」と訳すのが適切なのかな?良く分からないけど)

まぁ、仕様書には、すぐ下に、例として

<![CDATA[<greeting>Hello, world!</greeting>]]>

と書いてあるから、< と & だけじゃないことくらい分かりそうなものだけれど。


そもそも、何かをエスケープしたら、そのエスケープに使用した記号もエスケープの必要が出てくるわけで、エスケープを不要とするために導入した仕組みで2つもエスケープが必要になった時点でおかしいと気付きましょう。


タグ:XML
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0