4

XMLを作成するとき、データをエスケープするだけでなく、なぜCDATAブロックが使用されるのか疑問に思います。エスケープして通常のタグに配置できないCDATAブロックで許可されているものはありますか?

<node><![CDATA[ ...something... ]]></node>

それ以外の

<node>...something...</node>

当然、どちらの場合もデータをエスケープする必要があります。

function xmlspecialchars($text)
{
    return str_replace('&#039;', '&apos;', htmlspecialchars($text, ENT_QUOTES, 'utf-8'));
}

仕様から、CDATAは、データをエスケープするオプションがない場合に考えられる解決策にすぎなかったようですが、それでも信頼できます。たとえば、ブログからのRSSフィード(何らかの理由でエンティティをエスケープできない)。

4

2 に答える 2

2

CDATA は、元のテキストをそのまま保持する標準的な方法にすぎません。つまり、XML を処理するアプリケーションが何であれ、エスケープを解除するために明示的なアクションを実行する必要はありません。

予約済みシンボルを使用すると、通常、XHTML に埋め込まれた JavaScript でそれが得られます。

<script type="text/javascript">
//<![CDATA[
    var test = "<This is a string with reserved characters>";

    if (1 > 0) {
        alert(test);
    }
//]]>
</script>

代わりに、明示的にエスケープ解除する必要がありますif (1 &gt; 0)(そうではありません)。また、このようにはるかに読みやすくなっています。

于 2010-08-26T17:12:14.780 に答える
0

これは、何よりもまず読みやすさの機能です。XML と SGML は、もともと人間が読めるように意図されていたものでした - 信じられないかもしれませんが :-))

第二に、優れたパーサーの場合、これはパフォーマンス機能です。]]> エンディングは実際のブロックエンディングであることが保証されていますが、それ以外はブロブです。

Book パーサーは、ノード表現に情報/属性を保持して、明示的な CDATA があり、その中の単一の文字に決して触れないことを追跡する必要もあります。

于 2010-08-27T00:28:54.730 に答える