【问题标题】:Ignore XML namespace in T-SQL忽略 T-SQL 中的 XML 命名空间
【发布时间】:2011-03-29 02:53:21
【问题描述】:

使用 T-SQL 查询数据时,如何删除/忽略 xml 文件中的 XML 命名空间?

我正在将一个 xml 文件加载到一个变量中,它工作得很好。但是 xml 有一个命名空间集,除非我删除它,否则我的查询是空的。

T-SQL:

DECLARE @xml xml
SELECT @xml = BulkColumn FROM OPENROWSET(BULK 'C:\myfile.xml', SINGLE_BLOB) AS A

SELECT X.z.value('ID[1]', 'VARCHAR(3)') FROM @xml.nodes('myroot/element') AS X(z)

XML 示例:

<?xml version="1.0" encoding="utf-8"?>
<myroot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <element>
    <ID>1</ID>
  </element>
  <element>
    <ID>2</ID>
  </element>
  <element>
    <ID>3</ID>
  </element>
</myroot>

这行得通,查询返回:

1
2
3

但 XML 还包含一个默认命名空间:

<myroot xmlns="http://XXX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

xmlns="http://XXX" 完全搞砸了我的查询。不幸的是,在加载之前手动修改 xml 并不是一个真正的选择。

问题:

  • 当我将数据加载到变量中时,如何删除或忽略命名空间?
  • 或者如何修改我的查询来处理命名空间?

【问题讨论】:

    标签: sql-server-2005 tsql xml-namespaces


    【解决方案1】:

    就用这个吧:

    ;WITH XMLNAMESPACES(DEFAULT 'http://XXX')
    SELECT 
        X.z.value('ID[1]', 'VARCHAR(3)') 
    FROM 
        @xml.nodes('/myroot/element') AS X(z)
    

    WITH XMLNAMESPACES 允许您为查询定义命名空间别名,如果您不关心特定的 XML 命名空间前缀,您可以将其定义为 DEFAULT 命名空间并完成它。

    【讨论】:

      【解决方案2】:

      我在我的 XML 查询中遇到了同样的问题。 Namespace "xmlns="urn:tradefeed-xsd" 正在制造问题,我的查询返回空。

      <?xml version="1.0" encoding="UTF-8" ?> 
      <BatchFeed xmlns="urn:tradefeed-xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      

      一旦我在 select 语句之前使用了 ;WITH XMLNAMESPACES(DEFAULT 'urn:tradefeed-xsd') 语句,它就会返回数据。

      【讨论】:

        猜你喜欢
        • 2011-12-05
        • 2015-02-18
        • 1970-01-01
        • 2016-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        • 2016-06-24
        相关资源
        最近更新 更多