Utilisation de XPath pour sélectionner des attributs avec des caractères génériques

c# html html-agility-pack xpath

Question

J'ai besoin d'analyser le code HTML et j'utilise C # et Html Agility Pack Library pour effectuer la sélection des nœuds. Mon html ressemblera à quelque chose comme:

<input data-translate-atrr-placeholder="FORGOT_PASSWORD.FORM.EMAIL">

ou :

<input data-translate-atrr-placeholder="FORGOT_PASSWORD.FORM.EMAIL">

data-translate-attr-**** est le nouveau modèle d'attributs que je dois trouver

Je pourrais utiliser quelque chose comme ça:

<input data-translate-atrr-placeholder="FORGOT_PASSWORD.FORM.EMAIL">

mais malheureusement, cela ne cherchera que la valeur DANS un attribut. Comment rechercher l'attribut lui-même, avec un caractère générique?

Mise à jour: @Mathias Muller

<input data-translate-atrr-placeholder="FORGOT_PASSWORD.FORM.EMAIL">

Mise à jour 2

Cela semble être un problème de Pack d'agilité HTML plus qu'un problème de XPath, j'ai utilisé chrome pour tester mes expressions XPath et toutes les solutions suivantes ont fonctionné en chrome mais pas en Pack d'agilité HTML:

<input data-translate-atrr-placeholder="FORGOT_PASSWORD.FORM.EMAIL">

Ma solution

J'ai fini par faire les choses à l'ancienne ...

<input data-translate-atrr-placeholder="FORGOT_PASSWORD.FORM.EMAIL">

Réponse acceptée

Utilisez les fonctions XPath contains() ou starts-with() . Vous avez besoin d'une expression XPath telle que

//@*[contains(name(),'data-translate')]

ou peut-être

//@*[contains(name(),'data-translate')]

qui récupère réellement les nœuds d' attribut . Ci-dessus, le @* est l'attribut générique que vous recherchiez.


Réponse populaire

Plutôt que d'utiliser name() , utilisez local-name() tel que:

var nodes = htmlDoc.DocumentNode.SelectNodes("//@*[starts-with(local-name(),'data-translate')]");

la différence est que name() devrait vous donner le nom de l'attribut avec un préfixe tel qu'un espace de nom en xml, et local-name() émettra ce préfixe s'il est là, dans votre name() cas name() et local-name() devrait fonctionne de la même manière car son code HTML et il n’existe pas d’espaces de noms, mais il semblerait qu’ils ne le fassent pas et c’est probablement un bogue.

Tester:

var nodes = htmlDoc.DocumentNode.SelectNodes("//@*[starts-with(local-name(),'data-translate')]");



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi