Come ottenere tutti gli elementi di input in un modulo con HtmlAgilityPack senza ottenere un errore di riferimento null

c# html html-agility-pack parsing

Domanda

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

Codice di prova:

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

L'istruzione doc.GetElementbyId("form2").SelectNodes(".//input") mi fornisce un riferimento null.

Qualcosa che ho fatto di sbagliato? Grazie.

Risposta accettata

Puoi fare quanto segue:

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

Per impostazione predefinita, HTML Agility Pack analizza i moduli come nodi vuoti perché possono sovrapporsi ad altri elementi HTML. La prima riga ( HtmlNode.ElementsFlags.Remove("form"); ) disabilita questo comportamento consentendo di ottenere gli elementi di input all'interno del secondo modulo.

Aggiornamento: esempio di elementi del modulo si sovrappongono:

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

L'elemento inizia all'interno di una tabella ma viene chiuso all'esterno dell'elemento della tabella. Questo è consentito nelle specifiche HTML e HTML Agility Pack deve occuparsene.


Risposta popolare

Mettili in fila:

HtmlNodeCollection resultCollection = doc.DocumentNode.SelectNodes("//*[@type='text']");



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché