2012-12-27 101 views
3

發佈我的完整代碼並不是必需的,因爲我只有一個簡短的問題。我正在使用XML Doc中的XPath搜索文本值。我有一個XML像搜索特定節點之後的第一個匹配元素(XPath和iTunes 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() 

,但是這給了我所有下面的字符串標籤,我只是想第一個與宋標題。

招呼亞歷克斯

回答

1

使用

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

或者,可以使用一個只進表達:

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

請注意

這是一個常見的錯誤。所述的任何表達:

//someExpr[1] 

不選擇「從//someExpr選擇的所有節點在文檔中的第一個節點」。實際上它可以選擇多個節點。

上述表達式選擇//someExpr所選的任何節點,並且這是其父節點的第一個這樣的子節點。

這就是爲什麼沒有括號,這個問題的其他答案通常是不正確的。

0

您可以只需添加另一個謂詞[1]選擇第一個匹配的節點。使用text()嵌套謂詞應該是不必要的:

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

另一個,或許更高效,方式來選擇這個節點將是

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

這將選擇第一個節點(與任何名稱)繼通緝key節點並測試其名稱是否爲string