忽略 T-SQL 中的 XML 命名空间。

9

如何在使用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并不是一个很好的选择。

问题:

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

20

就使用这个:

;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命名空间并完成。


3
我在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">

当我在我的选择语句之前使用;WITH XMLNAMESPACES(DEFAULT 'urn:tradefeed-xsd')语句时,它会返回数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接