一尘不染

具有CDATA的SQL SERVER xml

sql

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

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

我尚未创建数据库,我无法更改信息存储在数据库中的方式,但可以通过选择来检索它。对于提取,我从表中选择了cast(replace(xml,’utf-8’,’utf-16’)as
xml)

除了cdata以外,它都运行良好,cdata在查询输出中的内容为:text-> text

有没有办法也检索CDATA标签?


阅读 147

收藏
2021-03-17

共1个答案

一尘不染

好吧,据我所知,这是正常情况下无法实现的…

CDATA 节的唯一原因是 XML中为懒惰的人 包括 无效字符 __

CDATA完全没有必要,因此通常的XML方法并没有真正支持它。或换句话说:以某种方式支持内容被正确地转义。CDATA实际上,正确转义的内容与未转义的内容之间没有区别!(好吧,有喜欢的,包括一些细微的差别]]>
一个CDATA-section和一些微小的特色…)

最大的问题是:为什么?

之后您打算如何处理?

试试这个。所包含的文本 按原样 给出:

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部分内。完全按照与其中的文本相同的方式返回“此处有一些值” 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;
2021-03-17