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

How do I use following xml query without prefix?

提问人:user3129097 提问时间:3/8/2017 最后编辑:Nimanthauser3129097 更新时间:11/13/2023 访问量:529

问:

在下面的链接 https://msdn.microsoft.com/en-us/library/ms175178.aspx 我找到了这句话:

“然后,在查询正文中使用此前缀,而不是命名空间 URI”

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

SQL Server XML T-SQL 命名空间

评论


答:

1赞 Shnugo 3/9/2017 #1

命名空间用于分隔同名元素。很多时候,XML 片段只是粘在一起。很有可能,具有相同名称的不同元素聚集在一起。通过使用命名空间,命名空间和元素名称的组合用于标识元素。但这并不重要,哪个别名用于指向命名空间

您必须区分“命名空间”和给定的“别名”。

以下示例具有两种风格的元素。看看这个:<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);

--wildcard-namespace:一切

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

--Only default namespace declared:仅返回默认元素

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!

评论

0赞 user3129097 3/12/2017
内容丰富,谢谢。 我已经复制了这个例子和一些令人怀疑的描述。<pre> <code> SELECT CatalogDescription.query(' declare namespace PD=“schemas.microsoft.com/sqlserver/2004/07/adventure-works/...”;/PD:ProductDescription/PD:Summary ') 作为 Production.ProductModel 的结果,其中 ProductModelID=19 <pre> <code>
0赞 user3129097 3/12/2017
这是产生疑问的行,请解释“然后在查询正文中使用此前缀而不是命名空间 URI”
0赞 Shnugo 3/13/2017
@user3129097,这一行(在我的示例中是)定义了命名空间的别名。命名空间是 (在您的示例中是 ) ,别名是 (在您的示例中) 。此别名在表达式中用作命名空间前缀,例如 (在您的示例中)。如果这解决了您的问题,请接受我的回答并投票,谢谢!declare namespace x="DefaultNS"; /x:root/x:aDefaultNSschemas.microsoft...xPD/x:root/x:a/PD:ProductDescription/PD:Summary
0赞 Shnugo 3/15/2017
@user3129097,这个问题解决了吗?您需要进一步的帮助吗?请允许我一个提示:如果这个问题解决了,那么在(最佳)答案的投票计数器下方勾选接受检查会是非常好的。这将 1) 将此问题标记为已解决 2) 让关注者更容易找到最佳解决方案 3) 向回答者支付积分和 4) 向您支付积分。由于您自己已经越过了 15 个点的边界,因此您还需要对贡献进行投票。这是表达感谢的SO方式。祝您编码愉快!