У меня есть проблемы с пакетом 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 .
Это заставит его возвращать пустую коллекцию вместо нуля, если нет узлов, соответствующих запросу (хотя я не уверен, почему это не было поведением по умолчанию для начала)