toh*_*hen 12 c# html-agility-pack
我在使用HTML Agility Pack时遇到了一些麻烦.
当我在不包含特定节点的HTML上使用此方法时,我得到一个空引用异常.它起初工作,但后来停止工作.这只是一个片段,还有大约10个foreach循环选择不同的节点.
我究竟做错了什么?
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();
}
Run Code Online (Sandbox Code Playgroud)
Ale*_*lex 30
如果没有找到节点,AFAIK DocumentNode.SelectNodes可以返回null.
这是默认行为,请参阅codeplex上的讨论主题:为什么DocumentNode.SelectNodes返回null
所以解决方法可能是重写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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这已更新,您现在可以通过设置阻止SelectNode返回null doc.OptionEmptyCollection = true,如本github issue中所述。
如果没有匹配查询的节点,这将使其返回一个空集合,而不是null(不过,我不确定为什么这不是默认的行为)