c# - HtmlAgilityPack Attributes.Remove on Image 只删除一个,当有两个时

标签 c# attributes 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 的摘要说:

Removes an attribute from the list, using its name. If there are more than one attributes with this name, they will all be removed.

我检查了 source code对于 CodePlex 中的 HtmlAttributeCollection,Remove 方法通过一个循环来删除值,因此一切看起来都应该有效。

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

最佳答案

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

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

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

关于c# - HtmlAgilityPack Attributes.Remove on Image 只删除一个,当有两个时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17220253/

相关文章:

c# - 在 GridView 的空单元格中显示消息

c# - 访问修改后的闭包,这是 ReSharper 错误吗?

c# - "X"在此上下文中不存在

javascript - 如何向指令添加 bool 属性?

c# - 使用 * 的 AssemblyVersion 失败,错误为 "wildcards, which are not compatible with determinism?"

python - 访问 BeautifulSoup 中的属性时出现问题

c# - 通用应用程序 (C#) 中未列出的 HTML Agility Pack SelectSingleNode 方法

c# - Onclick 事件在其下方显示一条红线

c# - HTMLAgilityPack : Screen Scraping Unable to Find a Div with Hyphen in Class Name?

vue.js - Vue点击按钮时改变属性值的方法