Редактировать 1: Вот как исправить документ HTML Agilty Pack, чтобы правильно отображать теги изображений (img):
if (HtmlNode.ElementsFlags.ContainsKey("img"))
{ HtmlNode.ElementsFlags["img"] = HtmlElementFlag.Closed;}
else
{ HtmlNode.ElementsFlags.Add("img", HtmlElementFlag.Closed);}
замените «img» на любой другой тег, чтобы исправить их (ввод, выбор и опция часто появляются). Повторите по мере необходимости. Имейте в виду, что это произойдет, а не из-за ошибки HAP, препятствующей одновременной установке флагов «закрыт» и «пусто».
Источник: Майк Бридж
Оригинальный ответ:
Просто поработав над решением этой проблемы и не найдя достаточных ответов (правильный тип документа, используя параметры «Выводить как XML», «Проверить синтаксис», «AutoCloseOnEnd» и «Создать пустой узел»), я смог решить эту проблему с помощью грязного хака.
Это, безусловно, не решит проблему для всех, но для любого, кто возвращает сгенерированный html / xml в виде строки (например, через веб-сервис), простое решение состоит в использовании поддельных тегов, которые пакет гибкости не знает, чтобы сломать.
Как только вы закончите делать все, что вам нужно сделать с вашим документом, вызовите следующий метод один раз для каждого тега, что вызовет головную боль (например, option, input и img). Сразу после этого визуализируйте вашу окончательную строку и выполните простую замену каждого тега с префиксом какой-либо строки (в данном случае «Fix_») и верните вашу строку.
На мой взгляд, это лишь незначительно лучше, чем решение регулярных выражений, предложенное в другом вопросе, который я не могу найти в данный момент (что-то вроде)
private void fixHAPUnclosedTags(ref HtmlDocument doc, string tagName, bool hasInnerText = false)
{
HtmlNode tagReplacement = null;
foreach(var tag in doc.DocumentNode.SelectNodes("//"+tagName))
{
tagReplacement = HtmlTextNode.CreateNode("<fix_"+tagName+"></fix_"+tagName+">");
foreach(var attr in tag.Attributes)
{
tagReplacement.SetAttributeValue(attr.Name, attr.Value);
}
if(hasInnerText)//for option tags and other non-empty nodes, the next (text) node will be its inner HTML
{
tagReplacement.InnerHtml = tag.InnerHtml + tag.NextSibling.InnerHtml;
tag.NextSibling.Remove();
}
tag.ParentNode.ReplaceChild(tagReplacement, tag);
}
}
В качестве примечания: если бы я был игроком на ставки, я бы предположил, что приведенный выше ответ MikeBridge непреднамеренно определяет источник этой ошибки в пакете - что-то заставляет закрытые и пустые флаги быть взаимоисключающими
Кроме того, после еще нескольких копаний я, похоже, не единственный, кто выбрал этот подход:
Параметр HtmlAgilityPack Drops End Tags
Кроме того, в случаях, когда вам нужны ТОЛЬКО непустые элементы, в этом же вопросе перечислено очень простое исправление, а также обсуждение кодекса HAP здесь : по сути, это устанавливает параметр пустого флага перечисленный в ответе Майка Бриджа выше постоянно везде.