如何使用以下不带前缀的 xml 查询

问题描述 投票:0回答:1

在以下链接中 https://msdn.microsoft.com/en-us/library/ms175178.aspx 我发现这个科特迪瓦“然后在查询正文中使用此前缀而不是命名空间 URI”

这让我觉得如果我不指定前缀那么我必须使用 uri 代替前缀。所以请给我一个使用 uri 代替前缀的例子, 因为在上面的链接中没有给出。只有他们给出了带有前缀的示例。

您真诚的

sql sql-server xml t-sql namespaces
1个回答
1
投票

命名空间旨在分隔具有相同名称的元素。很多时候,XML 片段只是“粘合”在一起。 同名的不同元素很可能聚集在一起。通过使用命名空间,命名空间和元素名称的组合用于标识元素。不过不重要,哪个alias是用来指向命名空间的 您必须区分“命名空间”和给定的“别名”。

以下示例具有两种风格的元素

<a>

。看看这个:

DECLARE @xml XML=
N'<root xmlns="DefaultNS" xmlns:dns="DerivedNS">
  <a>This is default</a>
  <dns:a>This is derived</dns:a>
</root>';

--没有结果

SELECT a.value(N'(text())[1]',N'nvarchar(max)') FROM @xml.nodes(N'/root/a') AS A(a);

--通配符命名空间:一切

SELECT a.value(N'(text())[1]',N'nvarchar(max)') FROM @xml.nodes(N'/*:root/*:a') AS A(a);

--仅声明默认命名空间:仅返回默认元素

WITH XMLNAMESPACES(DEFAULT 'DefaultNS') SELECT a.value(N'(text())[1]',N'nvarchar(max)') FROM @xml.nodes(N'/root/a') AS A(a);

--.nodes() 调用派生命名空间:仅返回派生元素

WITH XMLNAMESPACES(DEFAULT 'DefaultNS' ,'DerivedNS' AS xyz) --Other prefix, doesn't matter SELECT a.value(N'(text())[1]',N'nvarchar(max)') FROM @xml.nodes(N'/root/xyz:a') AS A(a); --prefix "dns" would not work, the alias is now "xyz"

--这里我使用随机前缀。我将“dns”作为默认别名!

WITH XMLNAMESPACES('DefaultNS' AS dns ,'DerivedNS' AS dns2) --random prefixes for the namespaces, took even dns for the wrong one! SELECT a.value(N'(text())[1]',N'nvarchar(max)') FROM @xml.nodes(N'/dns:root/dns:a') AS A(a); --prefix "dns" returns the default ns now! And you need the prefix at `root` too!

--带有内联声明

SELECT a.value(N'(text())[1]',N'nvarchar(max)') FROM @xml.nodes(N'declare namespace x="DefaultNS"; /x:root/x:a') AS A(a); --The alias "x" is now bound to the default namespace!

© www.soinside.com 2019 - 2024. All rights reserved.