Como seleciono elementos filho de qualquer profundidade usando XPath?

101

Suponha que eu tenha isto (simplificado):

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

Em seguida, posso selecionar o botão enviar pelo XPath //form[@id='myform']/input[@type='submit']. Ótimo.

No entanto, meus modelos podem mudar e eu quero ser flexível na profundidade em que o botão enviar está localizado. Pode ser colocado em uma mesa, assim:

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

Eu sei que posso selecionar elementos que são netos, mas não posso selecionar grand-grand-grand -...- childeren de qualquer profundidade. Por exemplo:

  • //form[@id='myform']/*/input[@type='submit'] seleciona apenas netos, sem maiores profundidades.
  • //form[@id='myform']/*/*/input[@type='submit'] seleciona apenas netos, nem mais nem menos profundidades.
  • //form[@id='myform']/**/input[@type='submit'] não é válido.

Então, como faço para selecionar este botão de envio de forma confiável sem usar IDs de elemento?

Gertvdijk
fonte

Respostas:

157

Você está quase lá. Basta usar:

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

O //atalho também pode ser usado dentro de uma expressão.

Nwellnhof
fonte
C # parece não entender essa notação. //form//inputretorna null em C # enquanto o Chrome pode encontrar 35 entradas usando o mesmo xpath
Achilles de
1
Meu último comentário é discutido aqui: stackoverflow.com/questions/23232671/…
Achilles,
14

Se você estiver usando o XmlDocument e o XmlNode.

Dizer:

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

Usar:

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

Depende da ferramenta que você usa. Mas .// selecionará qualquer filho, qualquer profundidade de um nó de referência.

sk
fonte
Funciona bem no Powershell usando o comando SelectSingleNode em um determinado nó XML extraído anteriormente.
Gizmo3399
9
//form/descendant::input[@type='submit']
luis long
fonte
6
adicione alguma descrição a ele.
piyushj 01 de
0

Além disso, você pode fazer isso com seletores de css:

form#myform input[type='submit']

espaço entre os elementos no css elector significa pesquisar a entrada [type = 'submit'] que os elementos em qualquer profundidade do formulário pai # elemento myform

Mahsum Akbas
fonte