使用XQuery从xml数据库中的特定(联合)标记中选择特定值

时间:2018-12-07 13:40:27

标签: xml xquery

因此,我正在学习如何使用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中获得这样的查询吗?谢谢你。

2 个答案:

答案 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

https://xqueryfiddle.liberty-development.net/pPgCcot/1

答案 1 :(得分:0)

以下XPath(您可以在XQuery中按原样使用)可以正常工作:

//dict/key[text() = 'Artist']/following-sibling::string[1]/text()

它找到Artist键,选择以下<string>标签,仅保留第一个标签并返回其文本内容。

您应该尝试将领先的//替换为指向<dict>标记的特定XPath,以获得更好的性能。