Riferimento NULL HTML Agility Pack

c# html-agility-pack

Domanda

Ho qualche problema con l'HTML Agility Pack.

Ricevo un'eccezione di riferimento null quando utilizzo questo metodo su HTML che non contiene il nodo specifico. All'inizio ha funzionato, ma poi ha smesso di funzionare. Questo è solo un frammento e ci sono circa 10 altri cicli foreach che selezionano nodi diversi.

Che cosa sto facendo di sbagliato?

public string Export(string html)
{
    var doc = new HtmlDocument();
    doc.LoadHtml(html);
    // exception gets thrown on below line
    foreach (var repeater in doc.DocumentNode.SelectNodes("//table[@class='mceRepeater']"))
    {
        if (repeater != null)
        {
            repeater.Name = "editor:repeater";
            repeater.Attributes.RemoveAll();
        }
    }

    var sw = new StringWriter();
    doc.Save(sw);
    sw.Flush();

    return sw.ToString();
}

Risposta accettata

AFAIK, DocumentNode.SelectNodes potrebbe restituire null se non è stato trovato alcun nodo.

Questo è un comportamento predefinito, vedere un thread di discussione su codeplex: Why DocumentNode.SelectNodes restituisce null

Pertanto, la soluzione alternativa potrebbe essere la riscrittura del blocco foreach :

var repeaters = doc.DocumentNode.SelectNodes("//table[@class='mceRepeater']");
if (repeaters != null)
{
    foreach (var repeater in repeaters)
    {
        if (repeater != null)
        {
            repeater.Name = "editor:repeater";
            repeater.Attributes.RemoveAll();
        }
    }
}

Risposta popolare

Questo è stato aggiornato ed è ora possibile impedire a SelectNodes di restituire null impostando doc.OptionEmptyCollection = true , come descritto in questo problema github .

Questo farà sì che restituisca una collezione vuota invece di null se non ci sono nodi che corrispondono alla query (non sono sicuro del perché questo non era il comportamento predefinito per cominciare, però)




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é