Modulo di analisi con HTML Agility Pack

c# html-agility-pack

Domanda

Sto cercando di estrarre tutti gli elementi di input da un modulo. Quando analizzo il seguente modulo:

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

tutto ha funzionato perfettamente, HTML Agility Pack è stato in grado di rilevare gli elementi di input nel modulo, ma se ha un nodo genitore div come il seguente, non verrà rilevato.

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

Sto usando il seguente codice

HtmlNode.ElementsFlags.Remove("form");

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

Qualcuno può dirmi cosa è andato storto? Grazie

Risposta accettata

HtmlNode.Elements metodo HtmlNode.Elements ottiene corrispondenti nodi figlio di prima generazione corrispondenti al nome. Dopo aver inserito gli input in un tag <div> diventano i nodi secondari di seconda generazione per l'elemento del modulo.

Per far funzionare il tuo codice usa il metodo HtmlNode.Descendants che ottiene tutti i nodi discendenti con il nome corrispondente:

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

Risposta popolare

Usa Descendants() invece di Elements() - il dopo funziona solo sui bambini diretti, ma i tuoi elementi di input sono annidati all'interno di div:

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


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow