2

我在我们的项目中使用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 中提供补丁的机会?

4

1 回答 1

1

已确认:image.Attributes.Remove仅删除第一次出现。

一种快速解决方法是多次调用 Remove。如果调用它但未找到该属性,则它什么也不做。

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

于 2013-06-20T17:55:51.390 回答