2009-01-17 15 views
17

jestem pewien parsowania XML coś takiego:Wybierz tylko pierwszą instancję z XPath?

<root> 
    <some_gunk/> 
    <dupe_node> 
     ... 
     stuff I want 
     ... 
    </dupe_node> 
    <bits_and_pieces/> 
    <other_gunk/> 
    <dupe_node> 
     ... 
     stuff I don't want 
     ... 
    </dupe_node> 
    <more_gunk/> 
</root> 

XPath z '//dupe_node' da mi dwie instancje dupe_node do zabawy. Chcę tylko przejść przez pierwszy. Czy mogę to zrobić z XPath?

Odpowiedz

39
/descendant::dupe_node[1] 

//dupe_node[1] jest ogólnie źle, choć produkuje identyczny rezultat w tym konkretnym przypadku. See docs:

Ścieżka lokalizacji // para [1] nie oznacza to samo co ścieżka/potomek :: para [1]. Ten ostatni wybiera pierwszy element potomny para; pierwszy wybiera wszystkie potomne elementy para, które są pierwszymi dziećmi z ich rodziców.

Biorąc pod uwagę następujące XML:

<foo> 
    <bar/> 
    <foo> 
     <bar/> 
    </foo> 
</foo> 

//bar[1] będzie produkować dwa węzły, ponieważ oba słupki są pierwszymi dziećmi swoich rodziców.

/descendant::bar[1] poda tylko jeden węzeł, który jest pierwszym ze wszystkich słupków w dokumencie.

+0

Więc jak to zapisać, jeśli chcesz pierwszy węzeł, który jest potomkiem lub self?/descendant :: dupe_node [1] wyklucza rację? – xr280xr

4

// dupe_node [1]

Powiązane problemy