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();
}
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();
}
}
}
Cela a été mis à jour et vous pouvez désormais empêcher SelectNodes de retourner null en définissant doc.OptionEmptyCollection = true
, comme détaillé dans ce problème github .
Cela lui fera retourner 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)