Problema XPath, ottenere "espressione deve valutare su un set di nodi". errore

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

Domanda

Ho problemi a recuperare un singolo nodo tramite il suo XPath esplicito che ho già trovato in altri modi. Ho il nodo e posso ottenere XPath, ma quando provo a recuperare di nuovo lo stesso nodo questa volta tramite node.XPath, restituisce l'errore "espressione deve valutare su un nodo". Non dovrebbe questo lavoro? Sto usando HtmlAgilityPack in C # btw per 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: questo è il valore di 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);

Risposta accettata

Sono riuscito a farlo funzionare sostituendo #text con la funzione text (). Non sono sicuro del motivo per cui non ha emesso lo XPath in questo modo in primo luogo.

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

Risposta popolare

Il tuo XPath termina con "#text [2]", che significa "il secondo attributo di testo". Gli attributi non sono nodi, sono metadati del nodo.
Questo è un problema comune che ho avuto con XPath: volere il valore di un attributo mentre l'operazione XPath deve assolutamente estrarre un nodo.

La soluzione che ho usato per questo è di avvolgere il mio recupero XPath con qualcosa che rileva e toglie la porzione di attributo della stringa (tramite una chiamata al metodo myXPathString.LastIndexOf ("#")) e quindi usa il myXPathString troncato per recuperare il nodo e raccogliere il valore dell'attributo desiderato come secondo passo.

Spero possa aiutare,
J




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché