Problema de XPath, obtener "la expresión se debe evaluar en un conjunto de nodos". error

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

Pregunta

Estoy teniendo problemas para recuperar un solo nodo por su XPath explícito que ya he encontrado de otras maneras. Tengo un nodo y puedo obtener su XPath, pero cuando intento recuperar ese mismo nodo nuevamente esta vez a través de node.XPath da el error "la expresión debe evaluar a un conjunto de nodos". ¿No debería esto funcionar? Estoy usando HtmlAgilityPack en C # por cierto para el 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);

Por cierto: este es el valor de node.XPath:

"/html[1]/body[1]/table[1]/tr[1]/td[1]/div[1]/div[1]/div[2]/table[1]/tr[1]/td[1]/div[1]/div[1]/table[1]/tr[1]/td[1]/div[1]/div[1]/div[4]/div[2]/div[1]/div[1]/div[4]/#text[2]"

Respuesta aceptada

Pude hacerlo funcionar reemplazando #text con la función text (). No estoy seguro de por qué no solo emitió el XPath de esa manera en primer lugar.

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

Respuesta popular

Tu XPath termina en "#text [2]", que significa "el segundo atributo 'texto'". Los atributos no son nodos, son metadatos de nodo.
Este es un problema común que he tenido con XPath: querer el valor de un atributo mientras que la operación XPath tiene que extraer un nodo.

La solución que he usado para esto es envolver mi búsqueda XPath con algo que detecta y elimina la parte del atributo de la cadena (a través de una llamada al método myXPathString.LastIndexOf ("#")) y luego usa el myXPathString truncado para recuperar el nodo y recoger el valor del atributo deseado como un segundo paso.

Espero que ayude,
J



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow