2015-04-28 24 views
7

Jeśli mam element, który wygląda tak:Jak wybrać bezpośrednim dzieckiem „tego elementu” w JSoup

<foo> 
    <bar> bar text 1 </bar> 
    <baz> 
     <bar> bar text 2 </bar> 
    </baz> 
</foo> 

I mam już element <foo> wybrany i chcę, aby wybrać <bar> element, który jest bezpośrednim potomkiem <foo>, ale nie tym, który jest dzieckiem z <baz>, jak to określić?

Element foo = <that thing above> 
foo.select("bar").text(); 

daje "bar text 1 bar text 2"

co chcę jest coś

foo.select("this > bar").text(); 

pytanie brzmi: jak mogę określić "ten element" w selektora?

Uwaga że pożądany bar może nie być - najpierw muszę rozwiązanie, które będzie również pracować dla:

<foo> 
    <baz> 
     <bar> bar text 2 </bar> 
    </baz> 
    <bar> bar text 1 </bar> 
</foo> 

Odpowiedz

6

Użyj strukturalny pseudo-element :root określenie „ten element”. Od Element.select Javadoc widzimy, że select używa "tego elementu jako kontekstu początkowego" i może pasować do "tego elementu lub któregokolwiek z jego elementów potomnych"; to jest, :root odnosi się do tego elementu, a nie do rzeczywistego katalogu głównego. Następujący kod pokazuje umieszczając drugi przykład, w niektórych zewnętrznych znaczniki:

//nest your second sample in some fake outer html body 
Element html = (Element)Parser.parseFragment("<html><body><foo>\n" + 
       " <baz>\n" + 
       "  <bar> bar text 2 </bar>\n" + 
       " </baz>\n" + 
       " <bar> bar text 1 </bar>\n" + 
       "</foo></body></html>", null, "http://example.com").get(0); 
Element foo = html.select("foo").first(); 

System.out.println(foo.select(":root > bar")); 

Kod ten drukuje

<bar> 
    bar text 1 
</bar> 

prawidłowo omijając zagnieżdżonej bar element.

Zgodnie z , strukturalna obsługa pseudoelementów została dodana w wersji 1.7.2.

+0

że wygląda to powinno działać na podstawie dokumentacji, ale z jakiegoś powodu dostaję 'SelectorParseException: Nie można zanalizować zapytania ': root> bar': nieoczekiwany token na ': root> bar'' kiedy go wypróbuję: -/ – PurpleVermont

+0

fajnie, po prostu idę w górę ocenione na 1.8.2 i teraz działa. Dzięki! – PurpleVermont

2

wierzę chcesz:

foo.select("> bar").text(); 

zobaczyć jsoup Selectors strona, Combinators sekcja:

E > F  an F direct child of E