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