10

使用 HTMLAgilityPack 写出一个新的图像节点,它似乎删除了图像的结束标记,例如应该是但是当你检查外部 html 时,有 .

string strIMG = "<img src='" + imgPath + "' height='" + pubImg.Height + "px' width='" + pubImg.Width + "px' />";

HtmlNode newNode = HtmlNode.Create(strIMG);

这会破坏 xhtml。

4

4 回答 4

22

告诉它按照 Micky 的建议输出 XML 是可行的,但如果您有其他不想要 XML 的原因,请尝试以下操作:

doc.OptionWriteEmptyNodes = true;
于 2009-11-24T11:43:17.790 回答
3

编辑 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 的答案中列出的空标志选项永久设置在任何地方。

于 2012-08-23T16:39:51.190 回答
2

有一个选项可以打开 XML 输出,从而消除此问题。

var htmlDoc = new HtmlDocument();
htmlDoc.OptionOutputAsXml = true;
htmlDoc.LoadHtml(rawHtml);
于 2009-10-13T01:15:11.037 回答
1

这似乎是 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>

为此,我在 CodePlex 中创建了一个问题。

于 2012-07-26T09:26:57.743 回答