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.