Formulario de análisis con HTML Agility Pack

c# html-agility-pack

Pregunta

Estoy tratando de extraer todos los elementos de entrada de un formulario. Cuando analizo la siguiente forma:

<form>
<input name='test1' type='text'>
<input name='test2' type='text'>
<input name='test3' type='text'>
</form>

Todo funcionó perfectamente, HTML Agility Pack pudo detectar los elementos de entrada en el formulario, pero si tiene un nodo principal div como el siguiente, no se detectará.

<form>
<div><input name='test1' type='text'></div>
<div><input name='test2' type='text'></div>
<div><input name='test3' type='text'></div>
</form>

Estoy usando el siguiente código

HtmlNode.ElementsFlags.Remove("form");

foreach (HtmlAgilityPack.HtmlNode node in postForm.Elements("input"))
{
    HtmlAgilityPack.HtmlAttribute valueAttribute = node.Attributes["value"];
}

¿Alguien puede decirme que salió mal? Gracias

Respuesta aceptada

HtmlNode.Elements método HtmlNode.Elements obtiene el nombre coincidente de los nodos secundarios de primera generación. Después de colocar sus entradas dentro de una etiqueta <div> se convierten en los nodos secundarios de segunda generación para el elemento de formulario.

Para hacer que su código funcione, utilice el método HtmlNode.Descendants que obtiene todos los nodos descendientes con nombre coincidente:

foreach (HtmlAgilityPack.HtmlNode node in postForm.Descendants("input"))
{
   HtmlAgilityPack.HtmlAttribute valueAttribute = node.Attributes["value"];
}

Respuesta popular

Use Descendants() lugar de Elements() : el último solo funciona en hijos directos, pero sus elementos de entrada están anidados dentro de divs:

 foreach (HtmlAgilityPack.HtmlNode node in postForm.Descendants("input"))
 {
     HtmlAgilityPack.HtmlAttribute valueAttribute = node.Attributes["value"];
 }


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