有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java搜索特定节点后的第一个匹配元素(XPath和ITunes XML)

没有必要发布我的完整代码,因为我只有一些简短的问题。我正在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>

我有一个这样的表达:

//string[preceding-sibling::key[text()[contains(., 'Name')]]]/text()

但是这给了我以下所有的字符串标签,我只想要第一个带有歌曲标题的

问候亚历克斯


共 (2) 个答案

  1. # 1 楼答案

    您只需添加另一个谓词[1]来选择第一个匹配节点。使用text()的嵌套谓词应该是不必要的:

    //string[preceding-sibling::key[contains(., 'Name')]][1]/text()
    

    选择此节点的另一种可能更有效的方法是

    //key[contains(., 'Name')]/following-sibling::*[1][self::string]
    

    这将选择所需key节点后面的第一个节点(具有任何名称),并测试其名称是否为string

  2. # 2 楼答案

    使用

    (//string[preceding-sibling::key[1] = 'Name'])[1]/text()
    

    或者,可以使用仅向前的表达式:

    (//key[. = 'Name'])[1]/following-sibling::string[1]/text()
    

    注意事项

    这是一个常见的错误。任何此类表达:

    //someExpr[1]
    

    不选择“文档中由//someExpr选择的所有节点中的第一个节点”。事实上,它可以选择多个节点

    上面的表达式选择由//someExpr选择的任何节点,并且该节点是其父节点的第一个子节点

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