Come si selezionano elementi figlio di qualsiasi profondità utilizzando XPath?


101

Supponiamo che io abbia questo (semplificato):

<form id="myform">
    <!-- some input fields -->
    <input type="submit" value="proceed"/>
</form>

Quindi posso selezionare il pulsante di invio di XPath //form[@id='myform']/input[@type='submit']. Grande.

Tuttavia, i miei modelli potrebbero cambiare e voglio essere flessibile nella profondità in cui si trova il pulsante di invio. Potrebbe essere messo in una tabella, come questa:

<form id="myform">
    <!-- some input fields -->
    <table><tr><td>
           <input type="submit" value="proceed"/>
    </td></tr></table>
</form>

So di poter selezionare elementi che sono nipoti, ma non posso selezionare grand-grand-grand -...- bambini di qualsiasi profondità. Per esempio:

  • //form[@id='myform']/*/input[@type='submit'] seleziona solo nipoti, senza ulteriori profondità.
  • //form[@id='myform']/*/*/input[@type='submit'] seleziona solo i nipoti, non più o meno profondità.
  • //form[@id='myform']/**/input[@type='submit'] non è valido.

Quindi, come faccio a selezionare questo pulsante di invio in modo affidabile senza utilizzare gli ID elemento?

Risposte:


157

Ci sei quasi. Usa semplicemente:

//form[@id='myform']//input[@type='submit']

La //scorciatoia può essere utilizzata anche all'interno di un'espressione.


C # non sembra capire questa notazione. //form//inputrestituisce null in C # mentre Chrome può trovare 35 input utilizzando lo stesso xpath
Achilles

1
Il mio ultimo commento è discusso qui: stackoverflow.com/questions/23232671/…
Achilles

14

Se stai usando XmlDocument e XmlNode.

Dire:

XmlNode f = root.SelectSingleNode("//form[@id='myform']");

Uso:

XmlNode s = f.SelectSingleNode(".//input[@type='submit']");

Dipende dallo strumento che utilizzi. Ma .// selezionerà qualsiasi figlio, qualsiasi profondità da un nodo di riferimento.


Funziona bene all'interno di Powershell utilizzando il comando SelectSingleNode su un determinato nodo XML estratto in precedenza.
Gizmo3399


0

Inoltre, puoi farlo con i selettori CSS:

form#myform input[type='submit']

lo spazio tra gli elementi in css elector significa cercare l'input [type = 'submit'] che gli elementi a qualsiasi profondità del form genitore # myform element

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.