Html Agility Pack InnerHtml restituisce una stringa errata con caselle di testo

html-agility-pack innerhtml

Domanda

Il seguente codice di prova:

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

Risultati in:

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

è un insetto? O c'è una configurazione che posso cambiare per produrre quel "/" extra di cui ho bisogno?

Grazie,

Chi

Risposta accettata

Questo non è un bug. INPUT è considerato dal parser come un elemento "vuoto" (si veda ad esempio: HTMLAgilityPack non conserva i tag vuoti originali sugli oggetti vuoti) e, per impostazione predefinita, tali elementi sono resi senza la chiusura /.

Le ragioni sono storicamente legate all'HTML 3.2. A quei tempi, INPUT non doveva essere chiuso, anche se oggi sembra un insetto.

Questo risolverà il tuo problema:

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

Come nota a margine, il pacchetto agilità HTML non crea sempre un equivalente esatto del testo html, ma proverà sempre a ricostruire qualcosa che sarà reso allo stesso modo. I browser supportano un INPUT non chiuso senza problemi.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché