2009-08-14 11 views
32

Jestem całkiem nowym użytkownikiem XPath, błądziłem z nim przez kilka godzin, więc nie jestem do końca pewien, czy możesz zrobić z nim coś takiego.XPath - Wybierz pierwszy element po jakimś innym elemencie

Okay, oto scenariusz: Chcę znaleźć link ze strony. To połączenie jest rozpoznawalne tylko poprzez jego wartość tekstową, tj. tekst pomiędzy tagami <a> (< a href = "#" > ten link <a>). Jak do tej pory udało mi się połączyć elementy z tym tekstem, jedynym problemem jest to, że jest kilka osób, które kłamią.

te linki znajdują się od nieuporządkowanych list, które są poprzedzone innym tagu Link, która będzie służyć jako naprawdę dobrą „kotwicy” punktu, aby rozpocząć wyszukiwanie dla końcowego elementu, który chcę znaleźć (tzn. Wtedy I może po prostu zaakceptować pierwszy pasujący)

do wyjaśnienia rzeczy trochę, tu jest przykładem tego, co się dzieje:

<a href="#">first dropdown menu</a> 
<ul> 
    <li><a href="#">some link</a></li> 
    <li><a href="#">link i want to find</a></li> 
</ul> 

<-- *And i would actually want to find the thing from this list* --> 
<a href="#">second dropdown menu</a> 
<ul> 
    <li><a href="#">some link</a></li> 
    <li><a href="#">link i want to find</a></li> 
</ul> 

a ja prawdopodobnie powinien określić, że chcę tylko do R eceive albo jeden wynik, albo zestaw wyników, z pierwszym elementem będącym "poprawnym" elementem - elementem, który chcę znaleźć.

EDIT: Pytanie zostało odebrane już, ale były pewne komentarze, które powinny określić to nieco więcej, tak, że ludzie mogą rzeczywiście zrozumieć pytanie;)

Chodziło o to, aby wykorzystać element określający lokalizację innego elementu, który może mieć zduplikowane wyniki wyszukiwania rozproszone po całym dokumencie.

Zasadniczo napotkasz coś takiego, jeśli chcesz znaleźć dany link z grupy menu rozwijanych, które mają elementy o tych samych nazwach lub wartościach.

To w zasadzie to. Wiem, że nadal trudno jest to zrozumieć, ale niestety ciężko jest mi to wyjaśnić. Jestem pewien, że ktoś inny mógłby wykonać lepszą pracę, a jeśli tak się stanie, z przyjemnością dołączę ten opis tutaj.

+0

Proszę zaktualizować pytanie - z odpowiedzi, można zobaczyć, że twoim celem nie jest jasne – Gishu

Odpowiedz

51

Musiałem przeczytaj parę razy twoje pytanie, ale myślę, że to rozumiem. To, czym jesteś zainteresowany, to predykaty. Predykaty umożliwiają wybieranie węzłów na podstawie warunków.

Na przykład, można zrobić:

//a[text()='second dropdown menu']/following::ul[1]/li/a[text()='link i want to find'] 

byłoby wybrać dowolny kotwicę z pewnym tekstem, znaleźć następną ul, a następnie przejść przez to jest dzieci.

Ponadto, można określić pozycyjny wskaźnik w zestawie wynikowym następujące XPath jest demonstracja (ale to nie rozwiąże problemu):

//a[text()='first dropdown menu']/ul/li[last()]/a/text() 

lub można użyć siekiery, aby poruszać się po drugiej stronie rodzeństwa/przodkowie/dzieci:

//a[ancestor::ul/preceding::a[1]/text() = 'second dropdown menu']/text() 

Nie jestem pewien, czy dobrze zrozumiałem twoje pytanie, ale powinno to pomóc w napisaniu XPath.

Zasadniczo zakładam, że twój XPath pasuje do kotwicy na wielu listach i chcesz mieć pewność, że wybierzesz właściwą. W pewnym momencie XPath potrzebujesz predykatu, aby określić warunek, który będzie prawdziwy tylko dla listy, w której znajduje się żądany węzeł.

+0

Działa pięknie. Dzięki ChrisCM! – JHollanti

4

tak rozumiem to poprawnie: chcesz „niektóre łącza” węzeł po „drugim menu rozwijanym”

ul[preceding::a[text()='second dropdown menu' and position()=last()]]/li/a[text()='link i want to find'] 

to powinno załatwić sprawę (nie jestem w 100% pewien, że będzie trzeba sprawdź pozycję() = 1, ale myślę, że jeśli ją pominiesz, będzie pasować do wszystkich następnych ul, ponieważ poprzedzenie jest "wszystkimi" poprzednimi węzłami - to zależy od reszty twojej struktury xml)

+0

Właściwie chciałem znaleźć związek z „linku Chcę znaleźć” wartości, ale będzie to zrobić po prostu także;) Sprawdzę to trochę. – JHollanti

+0

właśnie naprawiłem tę część :) – Niko

+0

Po prostu trochę czytałem i potrzebujesz pozycji() = ostatniej() zamiast pozycji() = 1 ponieważ poprzednia bierze wszystkie węzły przed węzłem kontekstu w porządku dokumentu ' – Niko

0

Popraw mnie, jeśli się mylę - musisz wybrać "drugie menu rozwijane" z przykład powyżej, ale tekst można duplikować, więc potrzebujesz tylko drugiego. XPath:

//a[text()='second drop down menu'][2] 
+0

Tak, ale chodzi o to, aby znaleźć element za pomocą dwóch oddzielnych "parametrów". Pierwszy parametr to "indeksowanie" znacznika, a drugi to konkretny element, który chcę znaleźć. Zatem odwoływanie się do statycznej pozycji nie jest możliwe. – JHollanti

+0

To powróci: second drop down menu lub nic jeśli jest tylko jedna kotwica, która je dopasowuje –

Powiązane problemy