Xpath为有效的Xpath表达式返回NULL

时间:2013-04-22 18:47:29

标签: sql-server xml xpath xquery xml-namespaces

我正在使用相当简单的Xpath查询(下面)来查询SQL Server 2008数据库列,其值都遵循示例的形式(在下面)。我的查询返回所有行的NULL,而不是example属性的值(例如“VALUE”),即使为我查询的每一行定义了example属性。

我尝试在我的Xquery表达式中声明xsdxsi名称空间,并从多个不同的属性名称中进行选择,但都没有任何效果。我错过了什么?

查询

select ColumnName.value('(/RootNode/@example)[1]', 'nvarchar(15)') [Result]
  from TableName

XML示例节点(实际的XML包含更多属性,我省略了这些属性):

<RootNode xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://intranet"
          example="VALUE">
  <IsValid>true</IsValid>
</RootNode>

使用命名空间尝试查询,结果相同

select ColumnName.value('
declare namespace xsd="http://www.w3.org/2001/XMLSchema";
declare namespace xsi="http://www.w3.org/2001/XMLSchema-instance";

(/RootNode/@example)[1]', 'nvarchar(15)') [Result]
  from TableName

2 个答案:

答案 0 :(得分:4)

您需要为xml数据添加默认命名空间,并且很可能修改xpath查询。

我没有运行此测试,但这是我最好的猜测,应该让你去:

WITH XMLNAMESPACES (N'http://intranet' as intra)
SELECT ColumnName.value('/intra:RootNode[@example]/intra:IsValid[1]', 'nvarchar(15)') [Result]
FROM TableName

答案 1 :(得分:4)

此查询有效。问题是数据节点声明了一个自定义的默认命名空间。

select ColumnName.value('
declare default element namespace "http://intranet";

(/RootNode/@example)[1]', 'nvarchar(15)') [Result]
  from TableName