Html Agility Pack InnerHtml возвращает неверную строку с текстовыми полями - PullRequest
2 голосов
/ 17 января 2011

следующий код теста:

[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

1 Ответ

3 голосов
/ 17 января 2011

Это не ошибка. 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));
}

В качестве примечания: пакет agility HTML не всегда создает точный эквивалент HTML text , но всегда будет пытаться перестроить что-то, что будет визуализированным . путь. Браузеры без проблем поддерживают открытый ввод.

...