我的数据库中有一个表,其中包含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标签?
好吧,据我所知,这是正常情况下无法实现的…
本 CDATA 节的唯一原因是: 在 XML中为懒惰的人 包括 无效字符 __…
CDATA
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;