regulares - ¿Cómo selecciono elementos secundarios de cualquier profundidad usando XPath?
xpath tutorial español (4)
Supongamos que tengo esto (simplificado):
<form id="myform">
<!-- some input fields -->
<input type="submit" value="proceed"/>
</form>
Entonces puedo seleccionar el botón de enviar por XPath //form[@id=''myform'']/input[@type=''submit'']
. Estupendo.
Sin embargo, mis plantillas pueden cambiar y quiero ser flexible en la profundidad en que se encuentra el botón de envío. Se puede poner en una mesa, así:
<form id="myform">
<!-- some input fields -->
<table><tr><td>
<input type="submit" value="proceed"/>
</td></tr></table>
</form>
Sé que puedo seleccionar elementos que son nietos, pero no puedo seleccionar nietos grand-grand -...- de cualquier profundidad. P.ej:
-
//form[@id=''myform'']/*/input[@type=''submit'']
solo selecciona grand-children, no profundidades adicionales. -
//form[@id=''myform'']/*/*/input[@type=''submit'']
solo selecciona bisnietos, sin más profundidades o menos. -
//form[@id=''myform'']/**/input[@type=''submit'']
no es válido.
Entonces, ¿cómo selecciono este botón de envío confiablemente sin usar ID de elemento?
Además, puedes hacerlo con los selectores de CSS:
form#myform input[type=''submit'']
espacio entre elementos en css elector significa búsqueda de entrada [type = ''submit''] que los elementos en cualquier profundidad de la forma padre # myform element
Si está utilizando XmlDocument y XmlNode.
Decir:
XmlNode f = root.SelectSingleNode("//form[@id=''myform'']");
Utilizar:
XmlNode s = f.SelectSingleNode(".//input[@type=''submit'']");
Depende de la herramienta que use. Pero .// seleccionará cualquier elemento secundario, cualquier profundidad de un nodo de referencia.
Ya casi estás ahí. Simplemente use:
//form[@id=''myform'']//input[@type=''submit'']
El atajo //
también se puede usar dentro de una expresión.
//form/descendant::input[@type=''submit'']