将包含enters(字符10或13)的字符串放入XMLCDATA节有什么用处吗?
我目前正在处理一些旧代码,其结构如下将包含enters(字符10或13)的字符串放入XMLCDATA节有什么用处吗?,xml,cdata,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 当字符串包含“\
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区域中吗 我可能有点偏离了这一点,但我似乎记得,将Javascript代码放在CDATA标记中是一个很好的建议。事实上,请参阅此堆栈溢出问题的选定答案,因为它很好地回答了问题的原因:我知道这听起来很明显,但如果您嵌入的是纯ascii文本文件,并且希望逐字保留文件的手动格式。这将是一个有用的案例
我遇到的其他情况是从图像输出元数据,我无法控制它们的格式。在XML中,CDATA保留空白,普通文本不保留空白。将文本放在CDATA节中应确保任何解析器都会忽略它,因此,上面的代码可以用来确保正确的格式,而不管解析器被告知如何处理空白
我认为它有效地说明了换行符在该部分中是有意义的,而不仅仅是偶然的。不知道为什么只有在出现换行符的情况下才会添加CDATA部分,所以我猜这只是一个解决办法,而不是给定代码中的一个设计问题。我想这完全取决于XML解析是否去除空白和控制字符。我相当肯定.NET中的System.Xml和MSXML或Xerces都没有,但可以选择这样做。因为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"/>
/xsl:text>
这就是XSLT处理器是由了解XML对象如何工作的人编写的,他们知道在他们的特定情况下,告诉DOM在纯空白文本节点中保留空白是很重要的。这里显然不使用javascript,所以我不明白这有什么关系,既然你提到了,每当我写XHTML的时候,我总是把javascript和css放在CDATA标记中——当你需要自由使用符号时,它只是让你的生活更轻松。这不是javascript,而是基本文本。原始海报没有定义它是否是javascript。我的答案只是指示何时建议在CDATA标记中放置带有CR\LFs的“字符串”。Ok。在我的测试用例中,我使用
root.getNodeValue()
检索字符串。因此,如果要返回“mytext\n\n\n”或“mytext”,这取决于我使用的xml实现!?我希望这种删除空白的方式不是默认的。在.net中,Xml读取器中有控制空白保留的属性(例如XmlDocument.PreserveWhitespace),我也怀疑这是一种解决方法,但不幸的是,代码commit没有记录为什么这样编写(新内容:-))。所以我希望有人能认识到类似的情况。