sql-server - 在 SQL Server XML 数据类型查询中使用命名空间时出现问题

标签 sql-server xml xml-namespaces

背景见这个问题:

SQL Server XML Data Type query issue

我正在尝试查询 SQL Server 2005 中的 XML 对象。当 XML 中没有定义命名空间时,查询工作正常。但是,当命名空间元素存在时,我似乎无法获取节点元素的值。这是一个例子:

DECLARE @xmlWithNameSpace XML
DECLARE @xmlWithoutNameSpace XML

SET @xmlWithNameSpace = '<?xml version="1.0" encoding="UTF-8"?>
    <Feed xmlns="gizmo">
        <Product id="4444">
            <ProductId>4444</ProductId>
        </Product>
    </Feed>'

SET @xmlWithoutNameSpace = '<?xml version="1.0" encoding="UTF-8"?>
    <Feed>
        <Product id="4444">
            <ProductId>4444</ProductId>
        </Product>
    </Feed>'

SELECT feed.product.value('@id[1]', 'INT') AS productId  
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product)

UNION ALL

SELECT feed.product.value('ProductId[1]', 'INT') AS productId  
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product)

UNION ALL

SELECT feed.product.value('@id[1]', 'INT') AS productId 
FROM @xmlWithoutNameSpace.nodes('/Feed/Product') feed(product)

UNION ALL

SELECT feed.product.value('ProductId[1]', 'INT') AS productId 
FROM @xmlWithoutNameSpace.nodes('/Feed/Product') feed(product)

返回

4444  
NULL  
4444  
4444

在使用命名空间时获取 ProductId 节点的值 (4444) 我做错了什么?

提前感谢您的指导。

最佳答案

答案是我还必须定义要使用名称规范访问的节点元素。所有这些示例都按预期返回 4444:

WITH XMLNAMESPACES ('gizmo' AS nsWithXNS)

SELECT feed.product.value('@id[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('/nsWithXNS:Feed/nsWithXNS:Product') feed(product)

UNION ALL

SELECT feed.product.value('nsWithXNS:ProductId[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('/nsWithXNS:Feed/nsWithXNS:Product') feed(product)

UNION ALL

SELECT feed.product.value('@id[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product)

UNION ALL

SELECT feed.product.value('declare namespace ns="gizmo"; ns:ProductId[1]', 'INT') AS productId 
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product)

感谢阅读,我希望这对其他人有帮助。

关于sql-server - 在 SQL Server XML 数据类型查询中使用命名空间时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3461302/

相关文章:

mysql - 通过 SQLCMD 将 sql 文件从 MySQL 导入到 MS SQL 时语法不正确

c# - 从资源中读取 xml 文件

c# - 将命名空间设置为 XElement

android - 什么是 'app' Android XML 命名空间?

Python:在 xml.etree 元素上指定 XMLNS

sql-server - 即使条件不适用也要计数

sql-server - MSSQL 到 Snowflake 数据类型的映射

sql - 将不同的行属性转置/旋转为列并将另一个属性分组?

java - 从 android studio 中的 java 类访问布局(.xml)

xml - 在 Go 中解析 SOAP