precisa de um javascript ou biblioteca jQuery para xpath converter para o formato CSS3 selecionável em jquery
-
22-07-2019 - |
Pergunta
Como posso converter XPath como
/html/body/div[3]/ul/li[1]/a[5]
html > body > div[3] > ul > li[1] > a[5]
eu acredito, o índice não é suportado com seletores CSS3 .... assim como lidar com isso?
Solução
Se você achar que Sizzle / jQuery não pode aplicar seu seletor CSS3 talvez seja melhor usar o XPath encaixe que fazia parte da versão original de jQuery (e, em seguida, removido uma vez que poucas pessoas realmente utilizado).
XPath implementações em navegadores tende a ser muito mais rápido do que os motores CSS. Também ter JS parse & converter uma expressão XPath em CSS3 depois ter jQuery munge que em algo que o navegador pode implementar (geralmente seletores CSS2.1 com um pouco de assistência JS) vai ser muito mais lento do que executar o XPath diretamente no navegador.
Não só isso, mas há coisas que XPath pode fazer que CSS não pode. Por exemplo:
//h3[class="blog-title"]/../../div[class="blog-entry"]//input[fn:floor(value) > 3]
que não é excessivamente complexa para XPath para executar, mas impossível para CSS sozinho -. de volta até o DOM mover e executar uma função como parte da expressão não pode (que eu saiba) ser feito ainda, mesmo em CSS3
Outras dicas
Selenium 1 do motor CSS localizador passou de CSSQuery a chiar, biblioteca seletor CSS do jQuery. Então você pode converter
div[3]/ul/li[1]/a[5]
para
css=div:nth(3)>ul>li:nth(1)>a:nth(5)
e
//h3[class="blog-title"]/../../div[class="blog-entry"]//input[@value=3]
pode ser convertido para
css=h3.blog-title:parent(div.blog-entry) input[value=3]
No entanto //input[@value>3]
pode não ser possível ou ser complicado
Para mais informações visite: https://github.com/jquery/sizzle/wiki/Sizzle- Início
a implementação XPath no IE é muito, muito lento. mesmo aterrorizante lento isso é IE6 porque a maioria tendem a usar seletores CSS com base em regex etc. como chiado ou o mais novo é qwery.
para um índice de escolha que você usa em CSS o :nth-child(n)
selector
a[5] = :nth-child(5)
eu não consigo lembrar se ele começa com 0 ou 1 por isso também poderia ser 4.
também se você tem diferentes tipos de crianças dentro do pai que você está selecionando, você pode usar :nth-of-type()
que seleciona apenas o tipo de dado. no seu caso:
a:nth-of-type(5)
Procurado para um pouco e finalmente encontrei estes 2 bibliotecas. Espero que ajude alguém tão perdido quanto me:
- O James Padolsey CSS2XPATH que foi usado pelo YQL HTML em um ponto de tempo
- css2xpath - A CSS genérico para XPath transformador
Como esta é uma área de nicho, saúdo a comunidade para fazer edições a esta.