将包含enter(char 10或13)的字符串放入xml CDATA部分是否有用?

时间:2009-05-29 09:08:21

标签: xml cdata

我目前正在研究一些具有以下构造的旧代码。

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部分吗?

6 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

在XML中,CDATA保留空白,普通文本不保留。

答案 2 :(得分:0)

我可能会基于此,但我似乎记得将Javascript代码放在CDATA标签中是一个很好的建议。事实上,看到这个堆栈溢出问题的选定答案,因为它在回答原因方面做得不错:When is a CDATA section necessary within a script tag?

答案 3 :(得分:0)

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

我认为它有效地表示换行符在该部分中是有意义的,而不仅仅是偶然的。不知道为什么如果存在换行符,你只会 放入CDATA部分,所以我猜它只是一个解决方法而不是给定代码中的副设计。

答案 4 :(得分:0)

我想说这完全取决于你的XML解析是否剥离空白和控制字符。我相当确定.NET中的System.Xml没有,也没有MSXML或Xerces,但有选项可以做到。

答案 5 :(得分: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在仅空白文本节点中保留空白是很重要的。