Excepción al consultar HTML para ID usando HTML Agility Pack

html html-agility-pack parsing xpath

Pregunta

Estoy usando el paquete de agilidad HTML para analizar un archivo ASPX dentro de Visual Studio.

Estoy buscando un elemento con un atributo de ID especificado.

El código que estoy usando es:

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

Sin embargo, cuando ejecuto este código, se lanza la excepción "La expresión debe evaluar a un conjunto de nodos".

¿Puede alguien decirme por qué este " debe " evaluar a un conjunto de nodos? ¿Por qué no puede simplemente devolver nodos (la siguiente línea llama tagsWithId.Count)? ¿Seguramente la HtmlNodeCollection que devuelve el método SelectNodes puede contener 0 nodos?

¿O es el error debido a una expresión Xpath malformada? [El ID de selector con el que estoy probando esto definitivamente existe en el archivo como <div id = "thisId">.]

¿Es posible cargar un archivo ASPX directamente desde Visual Studio (estoy creando un complemento) o esto contendrá errores de XML, y tendré que cargar la secuencia HTML de salida ( es decir, sin la declaración de la página al comienzo)? del archivo, etc. )?

Respuesta aceptada

El problema está en el argumento de SelectNodes() :

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

(después de llevar a cabo la sustitución) no es una expresión XPath legalmente táctica . Entonces, el problema no es que la expresión XPath "no devuelve nodos", el problema es que es sintácticamente ilegal.

Según la especificación XPath W3C:

" // es la abreviatura de /descendant-or-self::node()/ "

Así se expande lo anterior a:

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

Observe que el último paso de ubicación no tiene prueba de nodo y comienza con el predicado. Esto es ilegal de acuerdo con las reglas de sintaxis de XPath.

Probablemente quieras

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


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué