Comment sélectionner des éléments enfants de n'importe quelle profondeur à l'aide de XPath?

101

Supposons que j'ai ceci (simplifié):

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

Ensuite, je peux sélectionner le bouton Soumettre par XPath //form[@id='myform']/input[@type='submit']. Génial.

Cependant, mes modèles peuvent changer et je souhaite être flexible dans la profondeur dans laquelle se trouve le bouton d'envoi. Il pourrait être mis dans un tableau, comme ceci:

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

Je sais que je peux sélectionner des éléments qui sont des petits-enfants, mais je ne peux pas sélectionner grand-grand-grand -...- childeren de n'importe quelle profondeur. Par exemple:

  • //form[@id='myform']/*/input[@type='submit'] ne sélectionne que les petits-enfants, pas d'autres profondeurs.
  • //form[@id='myform']/*/*/input[@type='submit'] ne sélectionne que les petits-petits-enfants, ni plus ni moins de profondeur.
  • //form[@id='myform']/**/input[@type='submit'] n'est pas valide.

Alors, comment puis-je sélectionner ce bouton d'envoi de manière fiable sans utiliser d'ID d'élément?

gertvdijk
la source

Réponses:

159

Tu y es presque. Utilisez simplement:

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

Le //raccourci peut également être utilisé dans une expression.

nwellnhof
la source
C # ne semble pas comprendre cette notation. //form//inputrenvoie null en C # tandis que Chrome peut trouver 35 entrées en utilisant le même xpath
Achilles
1
Mon dernier commentaire est discuté ici: stackoverflow.com/questions/23232671/…
Achilles
14

Si vous utilisez XmlDocument et XmlNode.

Dire:

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

Utilisation:

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

Cela dépend de l'outil que vous utilisez. Mais .// sélectionnera n'importe quel enfant, n'importe quelle profondeur à partir d'un nœud de référence.

sk
la source
Fonctionne bien dans Powershell à l'aide de la commande SelectSingleNode sur un certain nœud XML extrait précédemment.
Gizmo3399
9
//form/descendant::input[@type='submit']
luis long
la source
7
ajoutez-y une description.
piyushj
0

En outre, vous pouvez le faire avec des sélecteurs css:

form#myform input[type='submit']

l'espace entre les éléments dans l'électeur css signifie la recherche de l'entrée [type = 'submit'] que les éléments à n'importe quelle profondeur du formulaire parent # élément myform

Mahsum Akbas
la source