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