0

我目前正在处理一些具有以下结构的旧代码。

Document doc = org.w3c.Document
Element root = doc.getDocumentElement();

if ( string contains \n or \r )
then
  root.appendChild(doc.createCDATASection(string))
else
  root.appendChild(doc.createTextNode(string))
endif  

当字符串包含“\n”或“\r”时,我想不出任何需要将字符串放入 CDATA 节的用法。我相信使用 createTextNode 不会导致任何修剪或删除文本中的换行符,以防字符串在您设置或检索值时类似于“mytext\n\n\n”。

有人能想到一个有效/有用的情况,您希望将这样的字符串放在 CDATA 部分中吗?

4

6 回答 6

1

我知道这听起来很明显,但是如果您要嵌入一个纯 ascii 文本文件,并且您希望逐字保留文件的手动格式。那将是一个有用的案例。

我遇到的其他情况是从图像中输出元数据,我无法控制它们的格式。

于 2009-05-29T09:16:44.330 回答
1

在 XML 中,CDATA 保留空格,而普通文本则没有。

于 2009-05-29T09:18:40.443 回答
0

由于 CDATA 部分允许您将任意数据放入 XML 文档中,而无需了解 XML 对象将如何处理它,因此它们经常被不了解 XML 对象如何工作的人使用。一般来说,当我看到有人在他们的 XML 中创建 CDATA 时,我会假设他们并不真正知道自己在做什么,除非他们已经包含了一个很好的解释。(而且通常情况下,这个好的解释表明他们不知道自己在做什么。)

最初的开发者可能混淆了 DOM 对包含空格的文本节点的处理与它对仅包含空格的文本节点的处理。DOM 经常规范化纯空白文本节点,这在 XML 中可能是一个问题,例如:

<xsl:value-of select="foo"/>
<xsl:text>    </xsl:text>
<xsl:value-of select="bar"/>

如果 DOM 将第二个元素中的四个空格规范化为一个空格,那会改变该转换的功能,这无疑是一件坏事。

但是您看不到像这样的 XSLT 是有原因的:

<xsl:value-of select="foo"/>
<xsl:text><![CDATA[    ]]>/xsl:text>
<xsl:value-of select="bar"/>

这就是 XSLT 处理器是由了解 XML 对象如何工作的人编写的,并且他们知道在他们的特定情况下,告诉 DOM 在纯空白文本节点中保留空白是很重要的。

于 2009-10-11T17:43:26.163 回答
0

我可能会偏离这个基础,但我似乎记得将 Javascript 代码放在 CDATA 标记中是一个很好的建议。实际上,请参阅此堆栈溢出问题的选定答案,因为它在回答原因方面做得不错:脚本标记中何时需要 CDATA 部分?

于 2009-05-29T09:15:28.560 回答
0

将文本放入 CDATA 部分应确保任何解析器都忽略它,因此上面的代码可用于确保正确的格式,无论解析器被告知如何处理空白。

我认为它有效地说明了换行符在该部分中是有意义的,而不仅仅是偶然的。不知道为什么你只会在存在换行符的情况下放入 CDATA 部分,所以我猜这只是一种解决方法,而不是给定代码中的设计问题。

于 2009-05-29T09:19:10.880 回答
0

我想说这完全取决于您的 XML 解析是否会去除空格和控制字符。我相当肯定 .NET 中的 System.Xml 没有,MSXML 或 Xerces 也没有,但有一些选项可以做到这一点。

于 2009-05-29T09:20:22.157 回答