【问题标题】:SQL Server query XML xpath empty namespaceSQL Server 查询 XML xpath 空命名空间
【发布时间】:2013-01-08 17:12:47
【问题描述】:

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

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

【问题讨论】:

  • &lt;RootNode&gt; 有一个非空的 XML 命名空间 - 所以你必须定义和使用它 - 我不明白你的问题到底是什么.....
  • 我的问题不清楚,/RootNode和/dft:RootNode都返回RootNode,所以不需要前缀。

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


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 2018-08-13
  • 2012-01-23
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多