带有CDATA的SQL SERVER xml

我的数据库中有一个表,其中包含一个包含xml的列.列类型为nvarchar(max). xml以这种方式形成

<root>
  <child>....</child>
  .
  .
  <special>
   <event><![CDATA[text->text]]></event>
   <event><![CDATA[text->text]]></event>
  ...
  </special>
</root>

我没有创建数据库,我无法更改信息存储在其中的方式,但我可以使用select检索它.对于我使用的提取
    select cast(replace(xml,’utf-8′,’utf-16′)为xml)
    从表

除了cdata之外它运行良好,其查询输出中的内容是:text – >文本

有没有办法检索CDATA标签?

最佳答案
嗯,据我所知,这是不可能的……

CDATA部分有一个唯一的原因:在XML中为懒人包含无效字符……

根本不需要CDATA,因此普通的XML方法并不支持CDATA.或者换句话说:内容被正确转义得到支持.实际上,正确转义的内容与CDATA中未转义的内容之间没有区别! (好的,有一些小的差异,比如包括]]>在CDATA部分和一些更小的专业……)

最大的问题是:为什么?

你之后想要做什么呢?

尝试这个.包含的文本按原样给出:

DECLARE @xml XML = 
'<root>
  <special>
   <event><![CDATA[text->text]]></event>
   <event><![CDATA[text->text]]></event>
  </special>
</root>'

SELECT t.c.query('text()')
FROM @xml.nodes('/root/special/event') t(c);

所以:请解释一些细节:你真正想要的是什么?

如果你真的只需要包装CDATA,你可以使用它:

SELECT '<![CDATA[' + t.c.value('.','varchar(max)') + ']]>'
FROM @xml.nodes('/root/special/event') t(c);

更新:与过时的FROM OPENXML相同

我刚试过使用FROM OPENXML的过时方法如何处理这个并发现,结果集中绝对没有任何迹象表明给定的文本最初是在CDATA部分内.这里的“Some value”与CDATA中的文本完全相同:

DECLARE @doc XML = 
'<root>
  <child>Some value here </child>
  <special>
   <event><![CDATA[text->text]]></event>
   <event><![CDATA[text->text]]></event>
  </special>
</root>';

DECLARE @hnd INT;

EXEC sp_xml_preparedocument @hnd OUTPUT, @doc;  

SELECT * FROM OPENXML (@hnd, '/root',0);

EXEC sp_xml_removedocument @hnd;  

转载注明原文:带有CDATA的SQL SERVER xml - 代码日志