Exception lors de la recherche d'identifiant HTML à l'aide de HTML Agility Pack

html html-agility-pack parsing xpath

Question

J'utilise le pack HTML Agility pour analyser un fichier ASPX dans Visual Studio.

Je recherche un élément avec un attribut ID spécifié.

Le code que j'utilise est:

var html = new HtmlAgilityPack.HtmlDocument();
html.LoadHtml(docText);
if (html.DocumentNode != null)
{
     try
     {
          var tagsWithId = html.DocumentNode.SelectNodes(string.Format("//[@id='{0}']", selector.Id));

Cependant, lorsque j'exécute ce code, l'exception "Expression doit être évaluée sur un ensemble de nœuds" est générée.

Quelqu'un peut-il me dire pourquoi ce " doit " est évalué à un ensemble de nœuds? Pourquoi ne peut-il pas simplement renvoyer aucun nœud (la ligne suivante appelle tagsWithId.Count)? La HtmlNodeCollection renvoyée par la méthode SelectNodes peut sûrement contenir 0 nœud?

Ou l'erreur est-elle due à une expression Xpath mal formée? [L'ID de sélecteur avec lequel je teste ceci existe définitivement dans le fichier sous le nom <div id = "thisId">.]

Est-il même possible de charger un fichier ASPX directement à partir de Visual Studio (je construis un complément) ou cela contiendra-t-il des erreurs XML et devrai-je plutôt charger le flux HTML de sortie ( c'est- à- dire sans la déclaration de page au début du fichier, etc. )?

Réponse acceptée

Le problème est dans l'argument de SelectNodes() :

//[@id='{0}']

(après avoir effectué le remplacement) n’est pas une expression XPath juridiquement légale . Le problème n'est donc pas que l'expression XPath "ne retourne aucun nœud" - le problème est que c'est syntaxiquement illégal.

Selon les spécifications XPath W3C:

" // est l'abréviation de /descendant-or-self::node()/ "

Ainsi, ce qui précède est étendu à:

/descendant-or-self::node()/[@id='{0}']

Notez que la dernière étape d'emplacement n'a pas de test de nœud et commence par le prédicat. Ceci est illégal selon les règles de syntaxe de XPath.

Vous voulez probablement :

//*[@id='{0}']



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