【问题标题】:Xpath returning NULL for valid Xpath expressionXpath 为有效的 Xpath 表达式返回 NULL
【发布时间】:2013-04-22 18:47:29
【问题描述】:

我正在使用一个相当简单的 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

【问题讨论】:

  • 我没有看到您的查询中提到的命名空间。不是xsixsd,而是默认设置一个http://intranet
  • @StenPetrov 我尝试添加这些,但没有任何区别,所以我删除了它们
  • xsdxsi 不会有区别,默认命名空间会。我在解密您的 xpath 时也遇到了麻烦。看起来您正在寻找具有 @exampleRootNode 检索 IsValid,这将是 //RootNode[@example]/IsValid
  • @StenPetrov 你是对的,它确实与默认命名空间有关。我将很快添加一个答案。谢谢。

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


【解决方案1】:

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

我还没有运行这个来测试,但这是我最好的猜测,应该让你继续:

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

【讨论】:

  • 谢谢,这是我刚刚得到的另一种语法。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多