Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 搜索特定节点(XPath和ITunes XML)后的第一个匹配元素_Java_Xml_Xpath_Itunes - Fatal编程技术网

Java 搜索特定节点(XPath和ITunes 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

没有必要发布我的完整代码,因为我只有一些简短的问题。我正在XML文档中使用XPath搜索文本值。我有一个类似XML的

<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
选择的任何节点,该节点是其父节点的第一个子节点

这就是为什么没有括号,这个问题的另一个答案通常是不正确的