Domanda

È possibile utilizzare XPath per selezionare solo i nodi con elementi figlio specifici? Ad esempio, da questo XML voglio solo gli elementi negli animali domestici che hanno un figlio di "bar". Quindi il set di dati risultante conterrebbe gli elementi lizard e pig da questo esempio:

<pets>
  <cat>
    <foo>don't care about this</foo>
  </cat>
  <dog>
   <foo>not this one either</foo>
  </dog>
  <lizard>
   <bar>lizard should be returned, because it has a child of bar</bar>
  </lizard>
  <pig>
   <bar>return pig, too</bar>
  </pig>
</pets>

Questo Xpath mi dà tutti gli animali domestici: " / pets / * " , ma voglio solo gli animali domestici che hanno un nodo figlio di nome 'bar' .

È stato utile?

Soluzione

Eccolo, in tutto il suo splendore

/pets/*[bar]

Inglese: dammi tutti i figli di animali che hanno un figlio bar

Altri suggerimenti

/pets/child::*[child::bar]

Scusa, non ho visto i commenti alla risposta precedente.

Ma in questo caso preferirei usare l'asse descendant :: , che include tutti gli elementi in giù rispetto a specificato:

/pets[descendant::bar]

Nel caso in cui volessi essere più specifico sui bambini, puoi anche usare selettori su di essi.

Esempio:

<pets>
    <cat>
        <foo>don't care about this</foo>
    </cat>
    <dog>
        <foo>not this one either</foo>
    </dog>
    <lizard>
        <bar att="baz">lizard should be returned, because it has a child of bar</bar>
    </lizard>
    <pig>
        <bar>don't return pig - it has no att=bar </bar>
    </pig>
</pets>

Ora ti preoccupi solo di tutti animali che hanno una barra che ha un attributo att con valore baz . Puoi usare la seguente espressione xpath:

//pets/*[descendant::bar[@att='baz']]

Risultato

<lizard>
    <bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top