Ссылка на HTML Agility Pack Null

c# html-agility-pack

Вопрос

У меня есть проблемы с пакетом 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();
}

Принятый ответ

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

Популярные ответы

Это было обновлено, и теперь вы можете запретить SelectNodes возвращать null, установив doc.OptionEmptyCollection = true , как подробно описано в этой проблеме github .

Это заставит его возвращать пустую коллекцию вместо нуля, если нет узлов, которые соответствуют запросу (я не уверен, почему это не было поведением по умолчанию для начала)



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow