我在项目中使用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的摘要说明了:
使用名称从列表中删除属性。如果有更多 与具有此名称的一个属性相比,它们都将被删除。
我在source code检查了CodePlex中的HtmlAttributeCollection,并且Remove方法通过循环来删除值,所以看起来它应该有效。
我是否使用了这个错误,或者我是否有机会在HtmlAgilityPack中提供补丁?
答案 0 :(得分:1)
确认:image.Attributes.Remove
仅删除第一次出现。
一个快速解决方法是多次调用Remove。如果它被调用并且找不到该属性,则它什么都不做。
您可能想让HtmlAgilityPack作者了解这一点。