HtmlAgilityPack道明.innertext缺陷实现
本文关键字:实现 缺陷 innertext 道明 HtmlAgilityPack | 更新日期: 2023-09-27 18:02:36
我正在从数据库中的数据构建一些表。它来自很多国际资源,所以我有编码问题,我想我已经把它们都清理干净了。但是现在我看到一些奇怪的输出,不知道为什么。
这是一个VS2010中的c#应用程序。在调试中运行,我看到类中的字符串开始:
Animal and vegetable oils 1 < 5 MW <br>5-50 MW 30 <br>
但是当我赋值为:
td = htmlDoc.CreateElement("td");
td.Attributes.Add("rowspan", "5");
td.Attributes.Add("valign", "top");
td.InnerHtml = this.DRGuideNote.ToString();
道明。InnerHtml显示
Animal and vegetable oils 1 < 5='"'" mw='"'"><br>5-50 MW 30 <br>
为什么要将等号和转义引号放入文本中??它不会对所有的数据进行处理,只会对几个文件进行处理。什么好主意吗?(PS.有html break在字符串没有出现,我怎么张贴,所以它忽略html?
HTML Agility Pack的HTML解析器将<
视为HTML标签的开始字符。因此,当它解析5和MW时,它认为它在标签内,因此它将它们视为标签属性。这种处理一旦进入<br>
就停止,这迫使它关闭标记。
它在浏览器中工作的原因是因为浏览器通常遵循HTML5规范来处理无效的HTML。该规范有很多关于如何处理无效HTML的规则,目的是让人们理解其意图。在这种情况下,规范规定后面跟着空格的carat应该被视为文本。HAP的解析器不处理这种特殊的边缘情况。所以我不会说这是一个bug,而是HAP原生HTML解析器的限制。
HAP的另一种选择是CsQuery (nuget),它使用完整的HTML5解析器(实际上与Firefox相同的HTML解析器),并且可以处理这种标记。