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

发布于 2024-10-27 04:31:48 字数 1196 浏览 2 评论 0原文

使用 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 并不是一个真正的选择。

问题

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

How do I remove/ignore the XML namespace in an xml file when querying the data with T-SQL?

I’m loading an xml file into a variable, and it works just fine. But the xml has a namespace set, and unless I remove it, my queries come up empty.

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 sample:

<?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>

This works, the query returns this:

1
2
3

But the XML also contains a default namespace:

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

The xmlns="http://XXX" completely screws up my query. And unfortunately manually modifying the xml before loading it is not really an option.

Questions:

  • How do I remove or ignore the namespace when I load the data into the variable?
  • Or how do I modify my query to handle the namespace?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小矜持 2024-11-03 04:31:48

只需使用这个:

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

Just use this:

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

The WITH XMLNAMESPACES allows you to define namespace aliasses for your queries, and if you don't care about a specific XML namespace prefix, you can just define it as DEFAULT namespace and be done with it.

顾冷 2024-11-03 04:31:48

我在 XML 查询中遇到了同样的问题。 命名空间“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')在我的 select 语句之前的语句它返回数据。

I was facing the same problem in my XML Query. Namespace "xmlns="urn:tradefeed-xsd" was creating problem and my query returns empty.

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

Once I used ;WITH XMLNAMESPACES(DEFAULT 'urn:tradefeed-xsd') statement before my select statement it returns data.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文