我的数据库中有一个表,其中包含一个包含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 - 代码日志