【问题标题】:Having trouble with XML namespaces in T-SQL在 T-SQL 中遇到 XML 命名空间问题
【发布时间】:2015-05-15 17:07:00
【问题描述】:

我成功地解析了一些 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)

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

我知道这与命名空间有关,因为它工作得很好,只是我从 XML 文件和 SQL 中删除了所有命名空间问题。

用 Google 搜索了很多......但仍然难以理解错误的概念。

【问题讨论】:

    标签: xml tsql xml-namespaces


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      由于命名空间是默认命名空间,您可以通过使用;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 中的元素时,都不需要添加相同的前缀。

      【讨论】:

        猜你喜欢
        • 2018-06-20
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多