Html Agility Pack InnerHtml返回带有文本框的错误字符串

时间:2011-01-17 03:52:39

标签: 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">"
--------------------------------------------------^

这是一个错误吗?或者是否有一个配置,我可以更改输出我需要的额外“/”?

谢谢,

1 个答案:

答案 0 :(得分:3)

这不是错误。解析器将INPUT视为“空”元素(请参阅此示例:空元素主题上的HTMLAgilityPack don't preserves original empty tags),默认情况下,这些元素在没有关闭/ /的情况下呈现。

原因在历史上与HTML 3.2有关。在那些日子里,INPUT不需要关闭,虽然它看起来像今天的bug。

这将解决您的问题:

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而没有问题。