1. ホーム
  2. xml

[解決済み] xmlのCDATAエンドトークンをエスケープする方法はありますか?

2022-06-02 08:32:21

質問

CDATA エンドトークンをエスケープする方法はあるのでしょうか? ]]> ) をエスケープする方法はあるのでしょうか?あるいは、より一般的には、CDATA 内で使用するためのエスケープシーケンスがあるかどうか(しかし、もしそれが存在するならば、とにかく、開始または終了トークンをエスケープすることだけが意味をなすと思われます)。

基本的に、CDATA に埋め込まれた開始または終了トークンをパーサーが解釈せず、単なる文字シーケンスとして扱うように指示することは可能です。

おそらく、そのようなことをしようとしていることに気づいたら、xml 構造またはコードをリファクタリングすべきですが、ここ 3 年ほど日常的に xml を扱っていてこの問題が発生したことがないにもかかわらず、それが可能かどうか疑問に思っていました。単なる好奇心で。

編集してください。

htmlエンコードを使用する以外に...

どのように解決するのですか?

明らかに、この質問は純粋に学術的なものです。幸いなことに、これには非常に明確な答えがあります。

CDATA のエンドシーケンスはエスケープできません。XML のプロダクション ルール 20 仕様の は非常に明確です。

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

編集部:この製品ルールは、文字通り、「CDataセクションは、']]>'というシーケンス以外のものなら何でも含むことができる」という意味です。例外はありません。

編集2: この製品ルールは と同じセクション も読み取れます。

CDATAセクション内では、CDEnd文字列のみがマークアップとして認識され、左角括弧とアンパサンドはそのままの形で使用することができます。 < および " & "です。CDATAセクションは入れ子にできません。

つまり、実体参照、マークアップ、その他の形式の解釈された構文を使うことはできません。CDATAセクションの内部でパースされるテキストは次のものだけです。 ]]> であり、それはセクションを終了させます。

したがって、エスケープすることはできません。 ]]> をCDATAセクション内でエスケープすることはできません。

EDIT3:このセクションの と同じセクション も読み取れます。

2.7 CDATAセクション

定義 CDATAセクションは、文字データが発生する可能性のある場所ならどこでも発生する可能性があります; それらは、さもなければマークアップとして認識されるであろう文字を含むテキストのブロックを回避するために使用されます。CDATAセクションは、文字列 "<で始まります![CDATA["と文字列 "で終わります]>":].

そして、文字データが発生する可能性のある場所には、単一のCDATAセクションの代わりに複数の隣接するCDATAセクションを含めて、CDATAセクションが存在する可能性があります。それによって ]]> トークンを分割し、その 2 つの部分を隣接する CDATA セクションに配置することができます。

の例です。

<![CDATA[Certain tokens like ]]> can be difficult and <invalid>]]> 

は次のように書きます。

<![CDATA[Certain tokens like ]]]]><![CDATA[> can be difficult and <valid>]]>