다음 테스트 코드 :
[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));
}
결과 :
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">"
--------------------------------------------------^
이거 버그 야? 또는 내가 필요로하는 추가 "/"출력으로 변경할 수있는 설정이 있습니까?
감사,
치
이것은 버그가 아닙니다. INPUT은 파서에 의해 "비어있는"요소로 간주됩니다 (예 : HTMLAgilityPack은 빈 요소를 빈 요소로 유지하지 않음 ). 기본적으로 이러한 요소는 닫히지 않고 렌더링됩니다.
이유는 HTML 3.2와 역사적으로 관련이 있습니다. 그 당시의 INPUT은 오늘날 버그처럼 보일지라도 폐쇄 될 필요가 없었습니다.
이렇게하면 문제가 해결됩니다.
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을 지원합니다.