re: test () XPath à HtmlAgilityPack (obtient tous les tags p avec une expression interne interne regex correspondante)

c# html html-agility-pack xpath

Question

Je veux toutes les balises <p>=.+=</p> . La regex fonctionne seule, sans les balises <p> .

Voici mon XPath: "//p[re:test(.,'^=.+=$', 'i')]"

Mais je reçois une exception quand je le branche sur,

HtmlNodeCollection pNodes = htmlDoc.DocumentNode.SelectNodes("//p[re:test(.,'^=.+=$', 'i')]");

L'exception est:

Namespace Manager ou XsltContext nécessaire. Cette requête a un préfixe, une variable ou une fonction définie par l'utilisateur.

Edit: le code HTML est généré par FCKEditor et aucun espace de nom n’est défini. Dois-je définir quelque chose pour que cela fonctionne?

Le HTML:

HtmlNodeCollection pNodes = htmlDoc.DocumentNode.SelectNodes("//p[re:test(.,'^=.+=$', 'i')]");

Réponse acceptée

L'erreur que vous avez est due au fait que l'expression re:test utilise une fonction XPATH nommée test (déclarée dans un espace de nom dont le préfixe est re ), inconnue du contexte XSLT.

Je ne sais pas d'où vous vient cette expression, mais ce n'est pas standard, cela ne veut donc rien dire dans le contexte du Pack d'agilité HTML :-)

Pour une explication détaillée, consultez cet article ici: Ajout de fonctions personnalisées à XPath . Notez que vous pourriez le faire fonctionner en utilisant ces techniques.

Cela dit, voici une implémentation "pure" de Agility Pack / XPATH Html:

var pNodes = htmlDoc.DocumentNode.SelectNodes("//p[text()='=.+=']");

Il utilise un filtre (entre [et]) et la fonction standard XPATH text () qui signifie "texte interne".


Réponse populaire

Apparemment, HtmlAgilityPack ne gère pas les espaces de noms (pas que j'en ai eu un). Donc, je suis venu avec ce hack,

var pNodes = htmlDoc.DocumentNode.SelectNodes("//p")
    .Where(node => Regex.Match(node.InnerText, "^=.+=$").Success);

S'il existe une solution HtmlAgilityPack, j'aimerais l'entendre!




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