2010-03-05 10 views
22

Ejemplo HTML: Código¿Cómo conseguir todos los elementos de entrada en una forma con HtmlAgilityPack sin conseguir un error de referencia nula

<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> 

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 declaración doc.GetElementbyId("form2").SelectNodes(".//input") me da una referencia nula.

¿Algo que hice mal? Gracias.

Respuesta

40

Usted puede 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); 
    } 
} 

Por defecto HTML agilidad paquete de análisis sintáctico de las formas como nodo vacío, ya que se permitió que se superponen 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 elementos de formulario se solapan:

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

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

+0

¿Esto significa que, a menos que use 'HtmlNode.ElementsFlags.Remove (" form ");', no es posible analizar elementos hijos de 'form' a través de HAP? –

+0

@Kevin, no tengo conocimiento de ninguna otra alternativa. –

+1

5 años después, sigue siendo un requisito, sigue siendo la respuesta correcta. Además, aún debe cambiarse en el paquete en sí ... – getglad

Cuestiones relacionadas