我在我們的項目中使用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作者了解這一點。