1

在对具有空命名空间的节点的 XML 字段执行 Xpath 查询时,我在 SQL Server 2008 R2 上遇到了一个奇怪的行为。

此查询不返回结果:

[xml_field].query('/RootNode/NodeWithEmptyNamespace')

此查询返回结果:

[xml_field].query('/dft:RootNode/NodeWithEmptyNamespace')

为澄清起见,此查询还返回结果,因此根节点(可能还有默认命名空间)不需要前缀:

[xml_field].query('/RootNode')

根据定义空命名空间时的XML 命名空间默认文档,命名空间为无。

数据库中的 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];

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

4

1 回答 1

4

目前尚不清楚您的问题是什么。使用 XML 示例,您已经发布了RootNode元素,并且otherNode元素在命名空间中http://tempuri.org,而NodeWithEmptyNamespace元素不在命名空间中(就像xmlns=""放在那里的那样)。使用 XPath,路径或步骤在无命名空间中选择该名称的元素,NodeWithEmptyNamespace并且RootNode也会在无命名空间中选择该名称的元素只有在您的输入中没有这样的元素。因此,您的路径/dft:RootNode/NodeWithEmptyNamespace正在做正确的事情,它选择名称RootNode空间中与dft前缀 (ie http://tempuri.org) 绑定的具有本地名称的元素及其NodeWithEmptyNamespace在无名称空间中具有本地名称的子元素。

于 2013-01-08T17:26:35.217 回答