tutorial regulares expresiones español xpath

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'']