在对具有空命名空间的节点的XML字段执行Xpath查询时,我在SQL Server 2008 R2上遇到了奇怪的行为。
此查询不会返回结果:
[xml_field].query('/RootNode/NodeWithEmptyNamespace')
此查询返回结果:
[xml_field].query('/dft:RootNode/NodeWithEmptyNamespace')
为了澄清这个查询也会返回结果,因此根节点(可能还有默认命名空间)不需要前缀:
[xml_field].query('/RootNode')
根据XML namespace default documation,当定义空命名空间时,命名空间为无。
数据库中的XML如下:
<RootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org">
<otherNode>Dummy data</otherNode>
<NodeWithEmptyNamespace xmlns="">Other dummy data</NodeWithEmptyNamespace>
</RootNode>
完整查询:
WITH XMLNAMESPACES ('http://tempuri.org' as dft)
SELECT TOP 150 [ID],
[xml_field].query('/dft:RootNode/NodeWithEmptyNamespace')
FROM [database];
是否有人对此行为有解释或这是一个错误?
答案 0 :(得分:4)
目前尚不清楚你的问题是什么。使用XML示例,您发布了RootNode
元素,otherNode
元素位于名称空间http://tempuri.org
中,而NodeWithEmptyNamespace
元素位于无名称空间中(作为xmlns=""
把它放在那里)。使用XPath,路径或步骤NodeWithEmptyNamespace
在没有命名空间的情况下选择该名称的元素,而RootNode
也会在 no 命名空间中选择该名称的元素,仅在您的输入中有没有这样的元素。所以你的路径/dft:RootNode/NodeWithEmptyNamespace
正在做正确的事情,它选择与RootNode
前缀(即dft
)及其子元素绑定的命名空间中具有本地名称http://tempuri.org
的元素在没有名称空间的情况下使用本地名称NodeWithEmptyNamespace
。