Html Agility Pack InnerHtml gibt eine falsche Zeichenfolge mit Textfeldern zurück

html-agility-pack innerhtml

Frage

Der folgende Testcode:

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

Ergebnisse in:

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">"
--------------------------------------------------^

Ist das ein Fehler? Oder gibt es eine Konfiguration, die ich ändern kann, um das zusätzliche "/" auszugeben, das ich brauche?

Vielen Dank,

Chi

Akzeptierte Antwort

Dies ist kein Fehler. INPUT wird vom Parser als "leeres" Element betrachtet (siehe zum Beispiel: HTMLAgilityPack behält die ursprünglichen leeren Tags der leeren Elemente nicht bei), und solche Elemente werden standardmäßig ohne das Schließen von / dargestellt.

Die Gründe sind historisch mit HTML 3.2 verbunden. Damals musste INPUT nicht geschlossen werden, obwohl es heute wie ein Bug aussieht.

Dies wird dein Problem beheben:

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

Als Randnotiz wird das HTML-Agility-Paket nicht immer eine exakte Entsprechung des HTML- Textes erstellen, sondern es wird immer versucht, etwas wiederherzustellen, das auf die gleiche Weise gerendert wird. Browser unterstützen einen nicht geschlossenen INPUT ohne ein Problem.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum