XMLを作成するとき、データをエスケープするだけでなく、なぜCDATAブロックが使用されるのか疑問に思います。エスケープして通常のタグに配置できないCDATAブロックで許可されているものはありますか?
<node><![CDATA[ ...something... ]]></node>
それ以外の
<node>...something...</node>
当然、どちらの場合もデータをエスケープする必要があります。
function xmlspecialchars($text)
{
return str_replace(''', ''', htmlspecialchars($text, ENT_QUOTES, 'utf-8'));
}
仕様から、CDATAは、データをエスケープするオプションがない場合に考えられる解決策にすぎなかったようですが、それでも信頼できます。たとえば、ブログからのRSSフィード(何らかの理由でエンティティをエスケープできない)。