3

短い質問があるので、完全なコードを投稿する必要はありません。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()

しかし、これにより、次のすべての文字列タグが得られます。最初の文字列タグが必要です。

アレックスに挨拶

4

2 に答える 2

1

使用

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

または、転送専用の式を使用することもできます。

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

注意してください

これは一般的なエラーです。この種の表現:

//someExpr[1]

「によって選択されたすべてのノードからドキュメントの最初のノード」を選択しません//someExpr。実際、多くのノードを選択できます。

//someExpr上記の式は、によって選択され、その親の最初のそのような子であるノードを選択します。

これが、角かっこがないと、この質問に対する他の答えが一般的に正しくない理由です。

于 2012-12-27T17:37:00.043 に答える
0

別の述語[1]を追加して、最初に一致するノードを選択できます。を使用するネストされた述語text()は不要である必要があります。

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

このノードを選択する別の、おそらくより効率的な方法は、

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

これにより、目的のノードに続く最初のノード(任意の名前)が選択され、keyその名前がであるかどうかがテストされますstring

于 2012-12-27T15:05:19.350 に答える