繁体   English   中英

如何使用XQUERY从XML中提取属性的值?

[英]How do I pull the value of an attribute from XML using XQUERY?

CREATE TABLE SportsEvent
(ID INT, Name NVARCHAR(20), Results XML);
GO


DECLARE @Results XML=
'<Athletics>
  <Event ID="001" Name="100m">
    <Gold>John Doe</Gold>
    <Silver>Harry Smith</Silver>
    <Bronze>Kenneth Brown</Bronze>
  </Event>
  <Event ID="002" Name="High Jump">
    <Gold>Sarah Jones</Gold>
    <Silver>Janice Johnson</Silver>
    <Bronze>Alicia Armstrong</Bronze>
  </Event>
</Athletics>'
INSERT INTO SportsEvent
VALUES(1, 'AthleticsDay', @Results);

SELECT * FROM SportsEvent;

如果我想根据事件ID提取元素,则没问题:

SELECT Results.query('(/Athletics/Event[@ID="001"]/Gold)')
FROM SportsEvent
WHERE ID = 1

我可以使用相对参考进行相同的操作:

SELECT Results.query('(Athletics/Event)[1]')
FROM SportsEvent
WHERE ID = 1

但是,如果我想基于相对或绝对来提取事件名称怎么办?:

SELECT Results.query('(Athletics/Event[@Name])[@ID="001"]')
FROM SportsEvent
WHERE ID = 1


SELECT Results.query('(Athletics/Event[@Name])[1]')
FROM SportsEvent
WHERE ID = 1

...两者都带回该事件的所有数据。

我尝试使用值方法:

SELECT Results.value('(/Athletics/Event/@Name)[1]','VARCHAR(20)')
FROM SportsEvent
WHERE ID = 1

...但是这仅适用于相对参考,即在这种情况下是XML中的第一组结果。

如果我想指定事件ID并仅返回事件名称(作为XML片段或作为数据/值)怎么办?

好的,所以对于某些人(很多?)来说,这似乎令人眼花obvious乱,但是我会贴上我的礼物,以防它阻止其他人花费令人沮丧的几个小时来回绕转(我刚刚做过)。

SELECT Results.value('(/Athletics/Event[@ID="001"]/@Name)[1]','VARCHAR(20)')
FROM SportsEvent
WHERE ID = 1

SELECT Results.value('(/Athletics/Event[@Name="100m"]/@ID)[1]','VARCHAR(20)')
FROM SportsEvent
WHERE ID = 1

SELECT Results.value('(/Athletics/Event[@Name="High Jump"]/@ID)[1]','VARCHAR(20)')
FROM SportsEvent
WHERE ID = 1

SELECT Results.value('(/Athletics/Event[@ID="002"]/@Name)[1]','VARCHAR(20)')
FROM SportsEvent
WHERE ID = 1

据我所知,您不能使用查询方法仅返回属性的值,查询必须使用不允许在元素外部的属性来编写。

但是,您可以按以下方式使用查询方法-路径末尾的'[1]'(单个)不是必需的(它们与value方法一起使用)。 您将获得包含指定属性的整个片段。

SELECT Results.query('(/Athletics/Event[@ID="002"][@Name])[1]')
FROM SportsEvent
WHERE ID = 1

SELECT Results.query('(/Athletics/Event[@Name="100m"][@Name])[1]')
FROM SportsEvent
WHERE ID = 1

希望这对某人有帮助。

欢迎任何评论,更正或增加。 谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM