HTML Agility Pack Null Référence

c# html-agility-pack

Question

J'ai quelques problèmes avec le pack d'agilité HTML.

J'obtiens une exception de référence null lorsque j'utilise cette méthode sur HTML ne contenant pas le nœud spécifique. Cela a fonctionné au début, mais ensuite il a cessé de fonctionner. Ce n'est qu'un extrait et il y a environ 10 autres boucles foreach qui sélectionnent différents nœuds.

Qu'est-ce que je fais mal?

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

Réponse acceptée

Autant que je sache, DocumentNode.SelectNodes peut renvoyer null si aucun nœud n'est trouvé.

Ceci est le comportement par défaut, voir un fil de discussion sur codeplex: Pourquoi DocumentNode.SelectNodes renvoie null

La solution pourrait donc consister à réécrire le bloc 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();
        }
    }
}

Réponse populaire

Cela a été mis à jour et vous pouvez maintenant empêcher SelectNodes de renvoyer null en définissant doc.OptionEmptyCollection = true , comme indiqué dans ce problème de github .

Cela lui fera renvoyer une collection vide au lieu de null s'il n'y a pas de nœuds qui correspondent à la requête (je ne sais pas pourquoi ce n'était pas le comportement par défaut pour commencer, cependant)




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi