以下测试代码:
[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">"
--------------------------------------------------^
这是一个错误吗?或者是否有一个配置,我可以更改输出我需要的额外“/”?
谢谢,
志
答案 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而没有问题。