2015-04-28 3 views
7

se ho un elemento che assomiglia a questo:Come posso scegliere un figlio diretto di "questo elemento" in JSoup

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

e ho già l'elemento <foo> selezionato, e voglio selezionare il <bar> elemento figlio diretto di <foo> ma non quello figlio di <baz>, come si specifica?

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

cede "bar text 1 bar text 2"

quello che voglio è qualcosa di simile a

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

La domanda è: Come faccio a specificare "questo elemento" nel selettore?

Si noti che il bar desiderato potrebbe non essere il primo - Ho bisogno di una soluzione che potesse funzionare anche per:

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

risposta

6

Utilizzare lo pseudo-elemento strutturale :root specificare "questo elemento". Da Element.select Javadoc, vediamo che select utilizza "questo elemento come contesto iniziale" e può corrispondere a "questo elemento o uno dei suoi figli"; ovvero, :root fa riferimento a questo elemento, non alla radice del documento effettiva. Il seguente codice mostra posizionando il secondo esempio in alcuni tag esterni:

//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")); 

stampe questo codice

<bar> 
    bar text 1 
</bar> 

correttamente saltando la nidificato bar elemento.

In base allo Jsoup changelog, il supporto pseudo-elemento strutturale è stato aggiunto in 1.7.2.

+0

che sembra che dovrebbe funzionare sulla base della documentazione, ma per qualche ragione io sto ottenendo 'SelectorParseException: Impossibile analizzare la query ': root> bar': token imprevisto a ': root> bar'' quando provo: -/ – PurpleVermont

+0

cool, I just up classificato a 1.8.2 e ora funziona. Grazie! – PurpleVermont

2

Ti credo voglia:

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

vedere jsoup Selectors pagina Combinators sezione:

E > F  an F direct child of E