HTML Agility Pack Null参考

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)


Har*_*rry 5

这已更新,您现在可以通过设置阻止SelectNode返回null doc.OptionEmptyCollection = true,如本github issue中所述

如果没有匹配查询的节点,这将使其返回一个空集合,而不是null(不过,我不确定为什么这不是默认的行为)