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合法嗎? 是的,了解原因