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 之前的初衷是人类可读的——信不信由你 :-))

其次,对于一个好的解析器来说,它是一个性能特性。]]> 结尾保证是实际的块结尾,但除此之外它是一个 blob。

本书解析器还应该将信息/属性保留在节点表示上,以跟踪它具有显式 CDATA 并且永远不会触及其中的单个字符。

于 2010-08-27T00:28:54.730 回答