2013-02-25 17 views
17

Wierzę, że powinno być możliwe uzyskanie odpowiedzi tylko za pomocą standardowego XPath bez odniesienia do implementacji, ale dla odniesienia używam obiektów DOM XML w .NET (Przestrzeń nazw System.Xml) .XPath, aby wybrać wszystkie elementy o określonej nazwie

Mam węzeł przekazany do mojej funkcji, gdzieś głęboko w dokumencie XML, i chcę wybrać wszystkie elementy potomne tego węzła, które mają określoną nazwę, niezależnie od pośredniczącej ścieżki do tych węzłów. Wezwanie Robię wygląda następująco:

node.SelectNodes("some XPath here"); 

Węzeł pracuję z wygląda mniej więcej tak:

... 
<food> 
    <tart> 
    <apple color="yellow"/> 
    </tart> 
    <pie> 
    <crust quality="flaky"/> 
    <filling> 
     <apple color="red"/> 
    </filling> 
    </pie> 
    <apple color="green"/> 
</food> 
... 

Co chcę jest lista wszystkich węzłów „jabłko” , czyli 3 wyniki. Próbowałem kilku różnych rzeczy, ale żaden z nich nie dostał tego, czego chcę.

node.SelectNodes("apple"); 

Daje mi to jeden wynik, zielone jabłko.

node.SelectNodes("*/apple"); 

Daje mi to jeden wynik, żółte jabłko.

node.SelectNodes("//apple"); 

To daje mi setki wyników, wygląda na każdym węźle jabłkowego w dokumencie, lub przynajmniej może każdy węzeł jabłko, które jest bezpośrednim potomkiem korzenia dokumentu.

Jak utworzyć XPath, który da mi wszystkie węzły jabłoni w moim bieżącym węźle, niezależnie od tego, jak głęboko pod bieżącym węzłem są znalezione? W szczególności, na podstawie powyższego przykładu, powinienem otrzymać trzy wyniki - czerwone, zielone i żółte jabłka.

Odpowiedz

25

Wypróbuj .//apple. Zawiera listę wszystkich węzłów apple, które są potomkami bieżącego węzła. Aby lepiej zrozumieć ten temat, powinieneś nauczyć się, jak działają osie XPath. Możesz również napisać na przykład descendant::apple.

+0

Idealne, właśnie tego szukałem. Wyszukałem Google przez godzinę i nie mogłem tego znaleźć. Aby wyjaśnić, aby zrozumieć, że rozumiem składnię poprawnie - podwójne ukośniki dają mi wszystkie węzły jabłek bez względu na głębokość (jak próbowałem w moim pytaniu powyżej), a kropka przed nimi ogranicza wybór do potomków obecnego węzła. Czy to jest poprawne? –

+0

Tak, zgadza się. Zmieniłem także mój post, aby dać ci dodatkowe wskazówki. – nwellnhof

+0

Edytowałeś swoją odpowiedź, mówiąc, że powinnam się nauczyć, jak działają osie XPath - zgadzam się. Czy masz jakieś sugestie dotyczące dobrych zasobów, które powinienem sprawdzić? –

Powiązane problemy