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));
}

結果是:

[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));
}

這是一個錯誤嗎?或者是否有一個配置,我可以更改輸出我需要的額外“/”?

謝謝,

一般承認的答案

這不是一個錯誤。解析器將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而沒有問題。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因