SQL Server查询XML xpath空命名空间

时间:2013-01-08 17:12:48

标签: sql-server xml xpath sql-server-2008-r2

在对具有空命名空间的节点的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];

是否有人对此行为有解释或这是一个错误?

1 个答案:

答案 0 :(得分:4)

目前尚不清楚你的问题是什么。使用XML示例,您发布了RootNode元素,otherNode元素位于名称空间http://tempuri.org中,而NodeWithEmptyNamespace元素位于无名称空间中(作为xmlns=""把它放在那里)。使用XPath,路径或步骤NodeWithEmptyNamespace在没有命名空间的情况下选择该名称的元素,而RootNode也会在 no 命名空间中选择该名称的元素,仅在您的输入中有没有这样的元素。所以你的路径/dft:RootNode/NodeWithEmptyNamespace正在做正确的事情,它选择与RootNode前缀(即dft)及其子元素绑定的命名空间中具有本地名称http://tempuri.org的元素在没有名称空间的情况下使用本地名称NodeWithEmptyNamespace

相关问题