Existe um arquivo HTML (cujo conteúdo eu não controlo) que possui vários input
elementos, todos com o mesmo id
atributo fixo de "search_query"
. O conteúdo do arquivo pode mudar, mas eu sei que sempre quero obter o segundo input
elemento com o atributo id "search_query"
.
Eu preciso de uma expressão XPath para fazer isso. Eu tentei, //input[@id="search_query"][2]
mas isso não funciona. Aqui está um exemplo de string XML em que esta consulta falhou:
<div>
<form>
<input id="search_query" />
</form>
</div>
<div>
<form>
<input id="search_query" />
</form>
</div>
<div>
<form>
<input id="search_query" />
</form>
</div>
Lembre-se de que o exposto acima é apenas um exemplo e o outro código HTML pode ser bem diferente e os input
elementos podem aparecer em qualquer lugar sem uma estrutura de documento consistente (exceto que eu estou garantido que sempre haverá pelo menos dois input
elementos com o atributo id "search_query"
)
Qual é a expressão XPath correta?
Respostas:
Esta é uma FAQ :
//somexpression[$N]
significa "Encontre todos os nós selecionados por
//somexpression
esse é o$N
th filho de seu pai".O que você quer é :
Lembre - se : O
[]
operador tem maior precedência (prioridade) que a//
abreviação.fonte
//input[@id='search_query'][2]
é:/descendat-or-self::node()/child::input[attribute::id='search_query'][position()=2]
Isso parece funcionar:
Eu digo isso em "Referência do programador XSLT 2.0 e XPath 2.0, 4ª edição", de Michael Kay.
Há também uma observação na seção "Sintaxe abreviada" da especificação XML Path Language http://www.w3.org/TR/xpath/#path-abbrev que forneceu uma pista.
fonte