Html Agility Pack InnerHtml возвращает неверную строку с текстовыми полями

html-agility-pack innerhtml

Вопрос

Следующий тестовый код:

[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 без проблем.



Related

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