Java 搜索特定节点(XPath和ITunes XML)后的第一个匹配元素
没有必要发布我的完整代码,因为我只有一些简短的问题。我正在XML文档中使用XPath搜索文本值。我有一个类似XML的Java 搜索特定节点(XPath和ITunes XML)后的第一个匹配元素,java,xml,xpath,itunes,Java,Xml,Xpath,Itunes,没有必要发布我的完整代码,因为我只有一些简短的问题。我正在XML文档中使用XPath搜索文本值。我有一个类似XML的 <key>Name</key> <string>Dat Ass</string> <key>Artist</key> <string>Earl Sweatshirt</string> <key>Album</key> <string>Kitche
<key>Name</key>
<string>Dat Ass</string>
<key>Artist</key>
<string>Earl Sweatshirt</string>
<key>Album</key>
<string>Kitchen Cutlery</string>
<key>Kind</key>
<string>MPEG-Audiodatei</string>
但是这给了我以下所有的字符串标签,我只想要第一个带有歌曲标题的
问候Alex您只需添加另一个谓词
[1]
即可选择第一个匹配节点。使用text()
的嵌套谓词应该是不必要的:
//string[preceding-sibling::key[contains(., 'Name')]][1]/text()
选择此节点的另一种可能更有效的方法是
//key[contains(., 'Name')]/following-sibling::*[1][self::string]
这将选择所需键
节点后的第一个节点(具有任何名称),并测试其名称是否为字符串
使用:
(//string[preceding-sibling::key[1] = 'Name'])[1]/text()
或者,可以使用仅向前的表达式:
(//key[. = 'Name'])[1]/following-sibling::string[1]/text()
注意事项:
(//string[preceding-sibling::key[1] = 'Name'])[1]/text()
这是一个常见的错误。任何此类表达:
//someExpr[1]
不选择“文档中由//someExpr
选择的所有节点中的第一个节点”。事实上,它可以选择许多节点
上面的表达式选择由//someExpr
选择的任何节点,该节点是其父节点的第一个子节点
这就是为什么没有括号,这个问题的另一个答案通常是不正确的