我目前正在研究一些具有以下构造的旧代码。
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部分吗?
答案 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在仅空白文本节点中保留空白是很重要的。