parser parse htmldocument htmlagilitypack agility c# html parsing html-agility-pack

c# - parse - htmlagilitypack xpath



Cómo obtener todos los elementos de entrada en un formulario con HtmlAgilityPack sin obtener un error de referencia nulo (1)

Puedes hacer lo siguiente:

HtmlNode.ElementsFlags.Remove("form"); HtmlDocument doc = new HtmlDocument(); doc.Load(@"D:/test.html"); HtmlNode secondForm = doc.GetElementbyId("form2"); foreach (HtmlNode node in secondForm.Elements("input")) { HtmlAttribute valueAttribute = node.Attributes["value"]; if (valueAttribute != null) { Console.WriteLine(valueAttribute.Value); } }

De forma predeterminada, HTML Agility Pack analiza los formularios como nodos vacíos porque pueden superponerse a otros elementos HTML. La primera línea, ( HtmlNode.ElementsFlags.Remove("form"); ) deshabilita este comportamiento permitiéndole obtener los elementos de entrada dentro del segundo formulario.

Actualización: ejemplo de superposición de elementos de formulario:

<table> <form> <!-- Other elements --> </table> </form>

El elemento comienza dentro de una tabla, pero se cierra fuera del elemento de la tabla. Esto está permitido en la especificación HTML y HTML Agility Pack tiene que lidiar con eso.

Ejemplo de HTML:

<html><body> <form id="form1"> <input name="foo1" value="bar1" /> <!-- Other elements --> </form> <form id="form2"> <input name="foo2" value="bar2" /> <!-- Other elements --> </form> </body></html>

Código de prueba:

HtmlDocument doc = new HtmlDocument(); doc.Load(@"D:/test.html"); foreach (HtmlNode node in doc.GetElementbyId("form2").SelectNodes(".//input")) { Console.WriteLine(node.Attributes["value"].Value); }

La instrucción doc.GetElementbyId("form2").SelectNodes(".//input") me da una referencia nula.

¿Algo que hice mal? Gracias.