130 votes

Comment sélectionner les éléments enfants de n'importe quelle profondeur en utilisant 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 de soumission par XPath //form[@id='myform']/input[@type='submit'] . Super.

Cependant, mes modèles sont susceptibles de changer et je veux être flexible quant à la profondeur dans laquelle se trouve le bouton d'envoi. Il pourrait être placé dans un tableau, comme celui-ci :

<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 des arrière-arrière-arrière-arrière-arrière...-enfants de n'importe quelle profondeur. Par exemple :

  • //form[@id='myform']/*/input[@type='submit'] ne sélectionne que les petits-enfants, sans autre profondeur.
  • //form[@id='myform']/*/*/input[@type='submit'] ne sélectionne que les arrière-petits-enfants, pas plus ou 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 les ID des éléments ?

199voto

nwellnhof Points 7740

Vous y êtes presque. Il suffit d'utiliser :

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

El // peut également être utilisé à l'intérieur d'une expression.

20voto

s k Points 1016

Si vous utilisez le XmlDocument et le XmlNode.

Dites :

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

Utilisez :

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 d'un nœud de référence.

10voto

luis long Points 101
//form/descendant::input[@type='submit']

-3voto

Mahsum Akbas Points 987

Vous pouvez également le faire avec des sélecteurs css :

form#myform input[type='submit']

l'espace entre les éléments dans css elector signifie rechercher input[type='submit'] que les éléments à n'importe quelle profondeur de l'élément parent form#myform

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X