Problème XPath, obtenir "l'expression doit être évaluée à un ensemble de nœuds". Erreur

.net c# html-agility-pack node-set xpath

Question

Je ne parviens pas à récupérer un seul nœud en raison de son XPath explicite que j'ai déjà trouvé par d'autres moyens. J'ai un noeud et je peux obtenir son XPath, mais lorsque j'essaie de récupérer le même noeud cette fois encore via node.XPath, l'erreur "l'expression doit être évaluée à un ensemble de noeuds" Cela ne devrait-il pas fonctionner? J'utilise HtmlAgilityPack en C # btw pour HtmlDocument.

HtmlDocument doc = new HtmlDocument();
doc.Load(@"..\..\test1.htm");
HtmlNode node = doc.DocumentNode.SelectSingleNode("(//node()[@id='something')])[first()]");
HtmlNode same = doc.DocumentNode.SelectSingleNode(node.XPath);

BTW: c'est la valeur de node.XPath:

HtmlDocument doc = new HtmlDocument();
doc.Load(@"..\..\test1.htm");
HtmlNode node = doc.DocumentNode.SelectSingleNode("(//node()[@id='something')])[first()]");
HtmlNode same = doc.DocumentNode.SelectSingleNode(node.XPath);

Réponse acceptée

J'ai pu le faire fonctionner en remplaçant #text par la fonction text (). Je ne sais pas pourquoi il n'a pas simplement émis l'XPath de cette façon.

HtmlNode same = doc.DocumentNode.SelectSingleNode(node.XPath.Replace("#text","text()");

Réponse populaire

Votre XPath se termine par "#text [2]", ce qui signifie "le deuxième attribut 'text'". Les attributs ne sont pas des nœuds, ils sont des métadonnées de nœud.
C'est un problème courant que j'ai rencontré avec XPath: vouloir la valeur d'un attribut pendant que l'opération XPath doit absolument extraire un nœud.

La solution que j'ai utilisée pour cela consiste à envelopper mon extraction XPath avec quelque chose qui détecte et supprime la partie attributaire de la chaîne (via un appel à la méthode myXPathString.LastIndexOf ("#")), puis utilise myXPathString tronqué nœud et collecter la valeur d'attribut souhaitée dans un deuxième temps.

J'espère que cela pourra aider,
J




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