web-dev-qa-db-fra.com

Qu'est-ce que les enfants de tous les profondeurs avec XPath?

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 d'envoi de XPath //form[@id='myform']/input[@type='submit']. Génial.

Cependant, mes modèles peuvent changer et je veux être flexible dans la profondeur dans laquelle se trouve le bouton d'envoi. Cela 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 un petit-grand-grand -...- enfant de quelque profondeur que ce soit. Par exemple.:

  • //form[@id='myform']/*/input[@type='submit'] sélectionne uniquement les petits-enfants, pas d'autres profondeurs.
  • //form[@id='myform']/*/*/input[@type='submit'] sélectionne uniquement les arrière-petits-enfants, pas plus profonds ni moins profonds.
  • //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'identifiant d'élément?

74
gertvdijk

Tu y es presque. Utilisez simplement:

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

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

120
nwellnhof

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.

9
s k
//form/descendant::input[@type='submit']
7
luis long

En outre, vous pouvez le faire avec les sélecteurs CSS:

form#myform input[type='submit']

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

0
Mahsum Akbas