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:
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">"
--------------------------------------------------^
è un insetto? O c'è una configurazione che posso cambiare per produrre quel "/" extra di cui ho bisogno?
Grazie,
Chi
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.