2

プロジェクトで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 でパッチを提供する機会を見つけましたか?

4

1 に答える 1

1

確認済み:image.Attributes.Remove最初に出現したもののみを削除します。

簡単な修正方法の 1 つは、Remove を複数回呼び出すことです。呼び出されたときに属性が見つからない場合、何もしません。

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

于 2013-06-20T17:55:51.390 に答える