在T-SQL中遇到XML命名空间问题

时间:2015-05-15 17:07:00

标签: xml tsql xml-namespaces

我成功解析了一些XML文件,并处理了涉及的命名空间。 但是我现在从不同的来源获得了一些XML,而且事情不一样!

这是我的XML(简化)

<ConnectionExport xmlns="http://www.sap.com/IS/Connection" version="14.2.4.732">
    <Connection>
        <technical_name>mytechname</technical_name>
    </Connection>
    <Connection>
        <technical_name>mytechname</technical_name>
    </Connection>
</ConnectionExport>

和我解析的代码

        SELECT 
            T.c.query('.')
            ,T.c.value('(@version)','nvarchar(250)')as [version]
            ,CN.c.query('.') as [connection]
        FROM   
        @xml.nodes('
            declare namespace cnn="http://www.sap.com/IS/Connection";
            (cnn:ConnectionExport)
            ') T(c)
            outer apply
            T.c.nodes('
                Connection
            ') as CN(c)

前两列按预期返回所有内容,完整的XML文本和[version]值。 但是,CN.c.query(&#39;。&#39;)只是NULL。

我知道它与命名空间有关,因为它可以正常工作,我从XML文件和SQL中删除所有命名空间问题。

谷歌搜索了很多......但仍然在努力去理解错误的概念。

2 个答案:

答案 0 :(得分:1)

发现它!!

;WITH XMLNAMESPACES ('http://www.sap.com/IS/Connection' AS ns)
    SELECT 
        T.c.query('.')
        ,T.c.value('(@version)','nvarchar(250)')as [version]
        ,CN.c.query('.') as [connection]
        FROM   
            @xml.nodes('ns:ConnectionExport') T(c)
            outer apply
            T.c.nodes('ns:Connection') as CN(c)

答案 1 :(得分:0)

由于命名空间是默认命名空间,您可以使用;WITH XMLNAMESPACES将命名空间注册为默认来简化查询:

;WITH XMLNAMESPACES (default 'http://www.sap.com/IS/Connection')
SELECT 
    T.c.query('.')
    ,T.c.value('(@version)','nvarchar(250)')as [version]
    ,CN.c.query('.') as [connection]
    FROM   
        @xml.nodes('ConnectionExport') T(c)
        outer apply
        T.c.nodes('Connection') as CN(c)

这样,除非另有说明,否则xquery中的所有元素都会在默认命名空间中隐式考虑。每次我们想要引用xquery中的元素时都不需要添加相同的前缀。