Следующий тестовый код:
[Test]
public void PossibleHtmlAgilityPackBug()
{
const string html = @"<input type=""text"" name=""shouldNotTrim"" />";
var doc = new HtmlDocument();
doc.LoadHtml(html);
Assert.That(doc.DocumentNode.InnerHtml, Is.EqualTo(html));
}
Результаты в:
Expected string length 42 but was 40. Strings differ at index 39.
Expected: "<input type="text" name="shouldNotTrim" />"
But was: "<input type="text" name="shouldNotTrim">"
--------------------------------------------------^
Это ошибка? Или есть конфиг, который я могу изменить для вывода этого дополнительного «/» мне нужно?
Благодаря,
Chi
Это не ошибка. INPUT рассматривается синтаксическим анализатором как «пустой» элемент (см. Это, например: HTMLAgilityPack не сохраняет исходные пустые теги для объектов с пустыми элементами), и по умолчанию такие элементы отображаются без закрытия /.
Причины исторически связаны с HTML 3.2. В те дни INPUT не требовалось закрывать, хотя сегодня это похоже на ошибку.
Это устранит вашу проблему:
public void PossibleHtmlAgilityPackBug()
{
const string html = @"<input type=""text"" name=""shouldNotTrim"" />";
var doc = new HtmlDocument();
doc.OptionWriteEmptyNodes = true;
doc.LoadHtml(html);
Assert.That(doc.DocumentNode.InnerHtml, Is.EqualTo(html));
}
В качестве побочного примечания пакет гибкости HTML не всегда создает точный эквивалент html- текста , но он всегда будет пытаться перестроить то, что будет отображаться одинаково. Браузеры поддерживают незакрытый INPUT без проблем.