Hay un archivo HTML (cuyo contenido no controlo) que tiene varios input
elementos, todos con el mismo id
atributo fijo de "search_query"
. El contenido del archivo puede cambiar, pero sé que siempre quiero obtener el segundo input
elemento con el atributo id "search_query"
.
Necesito una expresión XPath para hacer esto. Lo intenté //input[@id="search_query"][2]
pero eso no funciona. Aquí hay una cadena XML de ejemplo donde esta consulta falló:
<div>
<form>
<input id="search_query" />
</form>
</div>
<div>
<form>
<input id="search_query" />
</form>
</div>
<div>
<form>
<input id="search_query" />
</form>
</div>
Tenga en cuenta que lo anterior es simplemente un ejemplo y que el otro código HTML puede ser bastante diferente y que los input
elementos pueden aparecer en cualquier lugar sin una estructura de documento coherente (excepto que estoy seguro de que siempre habrá al menos dos input
elementos con un atributo id de "search_query"
)
¿Cuál es la expresión correcta de XPath?
Respuestas:
Esta es una pregunta frecuente :
//somexpression[$N]
significa "Buscar cada nodo seleccionado por
//somexpression
ese es el$N
hijo de su padre".Lo que quieres es :
Recuerde : el
[]
operador tiene mayor prioridad (prioridad) que la//
abreviatura.fuente
//input[@id='search_query'][2]
es:/descendat-or-self::node()/child::input[attribute::id='search_query'][position()=2]
Esto parece funcionar:
Voy esto de "XSLT 2.0 y XPath 2.0 Programmer's Reference, 4th Edition" de Michael Kay.
También hay una nota en la sección "Sintaxis abreviada" de la especificación XML Path Language http://www.w3.org/TR/xpath/#path-abbrev que proporciona una pista.
fuente