以下測試代碼:
[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">"
--------------------------------------------------^
這是一個錯誤嗎?或者是否有一個配置,我可以更改輸出我需要的額外“/”?
謝謝,
馳
這不是一個錯誤。解析器將INPUT視為“空”元素(例如,請參閱此示例: HTMLAgilityPack不會在空元素主題上保留原始空標記 ),默認情況下,這些元素在沒有關閉/的情況下呈現。
原因在歷史上與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而沒有問題。