因此,我正在学习如何使用XQuery和XPath以便从XML数据库进行查询,原因是我想创建一个与iTunes音乐库进行交互的应用程序。 iTunes将库数据存储在xml文件中。我的目标是创建艺术家及其专辑的列表(或可能是词典),但是稍后我将处理专辑。现在,我只是专注于获得(不同的)艺术家名单。
我正在努力创建必要的查询,以使我得到正确的结果。这是数据示例:
<key>13785</key>
<dict>
<key>Track ID</key><integer>13785</integer>
<key>Size</key><integer>8921131</integer>
<key>Total Time</key><integer>248520</integer>
<key>Disc Number</key><integer>1</integer>
<key>Disc Count</key><integer>1</integer>
...
<key>Artist</key><string>Green Day</string>
<key>Album Artist</key><string>Green Day</string>
<key>Album</key><string>Revolution Radio</string>
<key>Genre</key><string>Alternative</string>
<key>Kind</key><string>Apple Music AAC audio file</string>
<key>Location</key><string>file://localhost/C:/Users/Sthe%20Nyandeni/Music/iTunes/iTunes%20Media/Apple%20Music/Green%20Day/Revolution%20Radio/01%20Somewhere%20Now.m4p</string>
</dict>
我想在XQuery中创建一个查询,该查询将返回Artist标记中的字符串。
这是我到目前为止所拥有的:
let $doc := doc('C:/Users/Sthe Nyandeni/Desktop/temp/db.xml')
for $key in distinct-values($doc/plist/dict/dict/dict)
where $key/key = 'Artist'
return $key/string
我知道的是,如果这是SQL,则查询将类似于:
SELECT DISTINCT Artist FROM [the database/table] WHERE Key = "Artist"
有人可以帮我在XQuery中获得这样的查询吗?谢谢你。
答案 0 :(得分:3)
使用distinct-values(//key[. = 'Artist']/following-sibling::string[1])
。 https://xqueryfiddle.liberty-development.net/pPgCcot的示例。
如果您有XQuery 3和window子句支持,也可以使用
for tumbling window $pair in //dict/*
start $k when $k instance of element(key) and $k = 'Artist'
end $v when $v instance of element(string)
group by $name := $v
return $name
答案 1 :(得分:0)
以下XPath(您可以在XQuery中按原样使用)可以正常工作:
//dict/key[text() = 'Artist']/following-sibling::string[1]/text()
它找到Artist键,选择以下<string>
标签,仅保留第一个标签并返回其文本内容。
您应该尝试将领先的//
替换为指向<dict>
标记的特定XPath,以获得更好的性能。