HtmlAgilityPack属性。删除图像时只删除一个,当有两个时

attributes c# html-agility-pack

我在我们的项目中使用HtmlAgilityPack ,以便我可以从我们的另一个系统中显示一些Html。我在单元测试中遇到了这个问题,并希望确保我没有做错。如果我有一个图像,并且它有2个“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”值,如预期的那样。该行运行后,那里有1个“src”值,以“/ knowledge”开头。但是,我希望它们都被删除,因为Remove的摘要说:

使用名称从列表中删除属性。如果有多个具有此名称的属性,则将全部删除。

我在CodePlex中检查了HtmlAttributeCollection的源代码 ,并且Remove方法通过循环来删除值,所以一切看起来都应该有效。

我使用这个错误,还是我找到了在HtmlAgilityPack中提供补丁的机会?

一般承认的答案

已确认: image.Attributes.Remove仅删除第一个匹配项。

一个快速解决方法是多次调用Remove。如果它被调用并且找不到属性,则它什么都不做。

您可能想让HtmlAgilityPack作者了解这一点。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因