プロジェクトでHtmlAgilityPackを使用しているため、別のシステムから Html を表示できます。単体テストでこの問題に遭遇しました。何か間違ったことをしていないことを確認したいと思います。画像があり、2 つの「src」値がある場合、1 つを選択して両方を削除し、正しいパスで 1 つを追加します。私たちの 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」値があります。その行が実行された後、「/knowledge」で始まる「src」値が 1 つあります。ただし、削除の概要には次のように記載されているため、両方が削除されると予想されます。
名前を使用して、リストから属性を削除します。この名前の属性が複数ある場合、それらはすべて削除されます。
CodePlex で HtmlAttributeCollectionのソース コードを確認したところ、Remove メソッドが値を削除するためにループを通過するため、すべてが機能するように見えます。
私はこれを間違って使用していますか、それとも HtmlAgilityPack でパッチを提供する機会を見つけましたか?