图像标记未使用HTMLAgilityPack关闭

时间:2009-04-17 07:22:41

标签: html-agility-pack

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

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

HtmlNode newNode = HtmlNode.Create(strIMG);

这打破了xhtml。

4 个答案:

答案 0 :(得分:19)

告诉它输出XML,因为Micky建议有效,但如果你有其他理由不想要XML,试试这个:

doc.OptionWriteEmptyNodes = true;

答案 1 :(得分:3)

有一个选项可以打开XML输出,使这个问题消失。

var htmlDoc = new HtmlDocument();
htmlDoc.OptionOutputAsXml = true;
htmlDoc.LoadHtml(rawHtml);

答案 2 :(得分: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错误阻止同时设置“关闭”和“空”标志。 Source: Mike Bridge

原始答案: 刚刚解决了这个问题的解决方案,并没有找到任何足够的答案(doctype设置正确,使用输出为XML,检查语法,AutoCloseOnEnd和写空节点选项),我能够用一个肮脏的黑客来解决这个问题。 这肯定不能完全解决每个人的问题,但对于任何人将生成的html / xml作为字符串返回(EG通过Web服务),简单的解决方案是使用敏捷包不知道的假标签。 完成对文档执行的所有操作后,请为每个标记调用以下方法,使您感到头疼(值得注意的例子是选项,输入和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讨论here:这实际上设置了列出的空标志选项Mike Bridge的答案永远无处不在。

答案 3 :(得分: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>

I have created a issue in CodePlex for this.