使用 HTMLAgilityPack 写出一个新的图像节点,它似乎删除了图像的结束标记,例如应该是但是当你检查外部 html 时,有 .
string strIMG = "<img src='" + imgPath + "' height='" + pubImg.Height + "px' width='" + pubImg.Width + "px' />";
HtmlNode newNode = HtmlNode.Create(strIMG);
这会破坏 xhtml。
使用 HTMLAgilityPack 写出一个新的图像节点,它似乎删除了图像的结束标记,例如应该是但是当你检查外部 html 时,有 .
string strIMG = "<img src='" + imgPath + "' height='" + pubImg.Height + "px' width='" + pubImg.Width + "px' />";
HtmlNode newNode = HtmlNode.Create(strIMG);
这会破坏 xhtml。
告诉它按照 Micky 的建议输出 XML 是可行的,但如果您有其他不想要 XML 的原因,请尝试以下操作:
doc.OptionWriteEmptyNodes = true;
编辑 1:以下是如何修复 HTML Agilty Pack 文档以正确显示图像 (img) 标签:
if (HtmlNode.ElementsFlags.ContainsKey("img"))
{ HtmlNode.ElementsFlags["img"] = HtmlElementFlag.Closed;}
else
{ HtmlNode.ElementsFlags.Add("img", HtmlElementFlag.Closed);}
将“img”替换为任何其他标签以修复它们(输入、选择和选项经常出现)。根据需要重复。请记住,这将产生而不是 ,因为 HAP 错误会阻止同时设置“关闭”和“空”标志。 资料来源:迈克·布里奇
原始答案:刚刚研究了这个问题的解决方案,但没有找到任何足够的答案(正确设置了文档类型,使用输出为 XML、检查语法、AutoCloseOnEnd 和写入空节点选项),我能够用一个肮脏的黑客来解决这个问题. 这肯定不会彻底解决每个人的问题,但对于任何将生成的 html/xml 作为字符串返回(例如通过 Web 服务)的人,简单的解决方案是使用敏捷包不知道会破坏的虚假标签。一旦你完成了你需要对你的文档做的所有事情,为每个让你头疼的标签调用一次以下方法(值得注意的例子是 option、input 和 img)。紧接着,渲染你的最终字符串,并对每个以某个字符串为前缀的标签进行简单替换(在本例中为“Fix_”,并返回你的字符串。
private void fixHAPUnclosedTags(ref HtmlDocument doc, string tagName, bool hasInnerText = false)
{
HtmlNode tagReplacement = null;
foreach(var tag in doc.DocumentNode.SelectNodes("//"+tagName))
{
tagReplacement = HtmlTextNode.CreateNode("<fix_"+tagName+"></fix_"+tagName+">");
foreach(var attr in tag.Attributes)
{
tagReplacement.SetAttributeValue(attr.Name, attr.Value);
}
if(hasInnerText)//for option tags and other non-empty nodes, the next (text) node will be its inner HTML
{
tagReplacement.InnerHtml = tag.InnerHtml + tag.NextSibling.InnerHtml;
tag.NextSibling.Remove();
}
tag.ParentNode.ReplaceChild(tagReplacement, tag);
}
}
作为一个注释,如果我是一个赌徒,我会猜想上面 MikeBridge 的回答无意中确定了包中这个错误的来源——某些东西导致关闭和空标志是互斥的
此外,经过更多挖掘,我似乎并不是唯一采用这种方法的人: HtmlAgilityPack Drops Option End Tags
此外,在您只需要非空元素的情况下,在同一个问题中列出了一个非常简单的修复程序,以及此处的 HAP codeplex 讨论:这基本上将 Mike Bridge 的答案中列出的空标志选项永久设置在任何地方。
有一个选项可以打开 XML 输出,从而消除此问题。
var htmlDoc = new HtmlDocument();
htmlDoc.OptionOutputAsXml = true;
htmlDoc.LoadHtml(rawHtml);
这似乎是 HtmlAgilityPack 的一个错误。有很多方法可以重现这一点,例如:
Debug.WriteLine(HtmlNode.CreateNode("<img id=\"bla\"></img>").OuterHtml);
输出格式错误的 HTML。在其他答案中使用建议的修复没有任何作用。
HtmlDocument doc = new HtmlDocument();
doc.OptionOutputAsXml = true;
HtmlNode node = doc.CreateElement("x");
node.InnerHtml = "<img id=\"bla\"></img>";
doc.DocumentNode.AppendChild(node);
Debug.WriteLine(doc.DocumentNode.OuterHtml);
生成格式错误的 XML / XHTML,例如<x><img id="bla"></x>