Html Agility Pack InnerHtml renvoie une chaîne incorrecte avec des zones de texte.

html-agility-pack innerhtml

Question

Le code de test suivant:

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

Résulte en:

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

Est-ce un bug? Ou y a-t-il une configuration que je peux changer pour produire le "/" dont j'ai besoin?

Merci,

Chi

Réponse acceptée

Ce n'est pas un bug. L’analyseur considère INPUT comme un élément "vide" (voir par exemple: HTMLAgilityPack ne conserve pas les balises vides originales sur les sujets des éléments vides) et, par défaut, ces éléments sont restitués sans le fermant /.

Les raisons sont historiquement liées à HTML 3.2. À l'époque, INPUT n'était pas obligé d'être fermé, bien que cela ressemble à un bogue aujourd'hui.

Cela résoudra votre problème:

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

En passant, le pack d'agilité HTML ne créera pas toujours un équivalent exact du texte html, mais essaiera toujours de reconstruire quelque chose qui sera rendu de la même manière. Les navigateurs prennent en charge une entrée non fermée sans problème.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi