HtmlAgilityPack Attributes.Remove on Image Onlyは、2つの場合に1つを削除します。

attributes c# html-agility-pack

質問

私は私たちのプロジェクトで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"で始まる1つの "src"値があります。しかし、Removeのサマリーは次のように言います。

名前を使用してリストから属性を削除します。この名前の属性が複数ある場合、それらはすべて削除されます。

私はCodePlexのHtmlAttributeCollectionのソースコードをチェックし、Removeメソッドはループを通って値を取り除くので、すべてが動作するように見えます。

私はこれを間違って使用していますか、またはHtmlAgilityPackでパッチを提供する機会を見つけましたか?

受け入れられた回答

確認済み: image.Attributes.Removeは最初のオカレンスのみを削除します。

1つの簡単な修正は、複数回削除を呼び出すことです。それが呼び出され、その属性が見つからなければ何もしません。

HtmlAgilityPackの作成者にこれについて知ってもらいたいと思うかもしれません。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ