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. )?
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}']