【问题标题】:Searching for the first matching element after a specific node (XPath and ITunes XML)在特定节点之后搜索第一个匹配元素(XPath 和 ITunes XML)
【发布时间】:2012-12-12 22:50:09
【问题描述】:

不必发布我的完整代码,因为我只有一个简短的问题。我在 XML Doc 中使用 XPath 搜索文本值。我有一个 XML Like

<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()

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

问候亚历克斯

【问题讨论】:

    标签: java xml xpath itunes


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      使用

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

      或者,可以使用只进表达式:

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

      请注意

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

      //someExpr[1]
      

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多