在使用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并不是一个真正的选择。
问题:
答案 0 :(得分:19)
请使用:
;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
命名空间并使用它完成
答案 1 :(得分: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">
在select语句之前使用;WITH XMLNAMESPACES(DEFAULT 'urn:tradefeed-xsd')
语句后,它会返回数据。