Island Life

< ピアノレッスン8回目 | Stage fright (ピアノレッスン9回目) >

2011/07/08

CDATAと>のエスケープ

今まではっきり理解してなかったけど、ちょっとひっかかって規格を 調べたのでメモ。

XMLのテキストセクションで > は必ずしもエスケープする必要はないが、 ]]> という並びで現れる場合に限り (それがCDATAの終了を意図したものでなければ) > はエスケープされなければならない (MUST)。 ( http://www.w3.org/TR/REC-xml/#syntax )

Gaucheでsxmlを使っている限りは > は全てエスケープされるので 特に気にしてなかったんだが、Franzのnet-xml-generatorで生成したXMLが エラーになるケースがあって気づいた。(バグ報告済み)

一方AttValueの方は ]]> を特別扱いする必要はない ( http://www.w3.org/TR/REC-xml/#NT-AttValue )。こっちはCDATAの終了と 誤認するおそれがないのでもっともだけど。若干ややこしい。

もひとつ、CDATAで囲みたいテキスト中に ]]> があった場合にどうすれば 良いか、という問題。CDATAの中はエスケープができないので ]]> をそのまま含めるのは不可能と思い込んでいたんだが (wiliki/rss.scmでは &93;]> に置換してたけど、CDATA中の&93;は 数値参照にはならないので不可逆な変換になってしまっている)、 ]]> 等にCDATAセクションを分割するって手があったんだな。

  CDATA中に]]>を含める

  <![CDATA[CDATA中に]]]]><![CDATA[>を含める]]>

とすればいいわけだ。

Tag: Programming

Post a comment

Name: