HtmlAgilityPack属性.在图像上删除仅删除一个,当有两个时

本文关键字:删除 两个 一个 属性 图像 HtmlAgilityPack | 更新日期: 2023-09-27 18:19:27

我在项目中使用HtmlAgilityPack,这样我就可以显示来自另一个系统的一些Html。我在单元测试中遇到了这个问题,我想确保我没有做错什么。如果我有一个图像,它有两个"src"值,我想选择一个,将它们都删除,然后用正确的路径添加一个。我不认为我们的Html会发生这种情况,但以防万一。。。。

因此,这里有一个示例图像标签:

<img align='"left'" alt='"'" src='"/blah.jpg'" src='"/knowledge/blah.jpg'" border='"0'" />

以下是操作Html:的代码

    public static string FixHtmlLinks(this string html)
    {
        var htmlDoc = new HtmlDocument()
        {
            OptionWriteEmptyNodes = true
        };
        htmlDoc.LoadHtml(html);
        var imagesToCheck = htmlDoc.DocumentNode.SelectNodes("//img[@src!='']");
        if (null != imagesToCheck)
        {
            foreach (var image in imagesToCheck.ToList())
            {
                var src = image.GetAttributeValue("src", string.Empty);
                if (Uri.IsWellFormedUriString(src, UriKind.Relative))
                {
                    image.Attributes.Remove("src");
                    image.SetAttributeValue("src", string.Format(RELATIVE_IMAGE_PROTOCOL_AND_HOST, src));
                }
                else if (Uri.IsWellFormedUriString(src, UriKind.Absolute))
                {
                    image.Attributes.Remove("src");
                    image.SetAttributeValue("src", src.Replace(ABSOLUTE_IMAGE_HOST_TO_REPLACE, IMAGE_PROTOCOL_AND_HOST));
                }
            }
        }
        return htmlDoc.DocumentNode.OuterHtml;
    }

当我调试时,它到达"image.Attributes.Remove("src");"行,如预期的那样,有2个"src"值。在这一行运行之后,有一个"src"值,以"/aknowledge"开头。然而,我希望它们都被删除,因为删除的摘要说:

使用属性的名称从列表中删除该属性。如果还有更多如果有多个具有此名称的属性,则它们都将被删除。

我在CodePlex中检查了HtmlAttributeCollection的源代码,Remove方法将其放入一个循环中以删除值,所以一切看起来都应该正常。

我用错了吗,或者我找到机会在HtmlAgilityPack中提供补丁了吗?

HtmlAgilityPack属性.在图像上删除仅删除一个,当有两个时

已确认:image.Attributes.Remove只删除第一次出现的内容。

一个快速解决方法是多次调用Remove。如果调用了它,但找不到属性,它将不执行任何操作。

您可能想让HtmlAgilityPack的作者知道这一点。