Attributs HtmlAgilityPack.Supprimer sur l'image uniquement en supprime un, lorsqu'il y en a deux

attributes c# html-agility-pack

Question

J'utilise HtmlAgilityPack dans notre projet, afin de pouvoir afficher du code HTML à partir d'un autre de nos systèmes. J'ai rencontré ce problème lors de mes tests unitaires et je veux m'assurer que je ne fais pas quelque chose de mal. Si j'ai une image et qu'elle a 2 valeurs "src", j'aimerais en choisir une, les supprimer toutes les deux et en ajouter une avec le bon chemin. Je ne pense pas que cela se produira avec notre code HTML, mais juste au cas où ...

Alors, voici un exemple d'image tag:

<img align=\"left\" alt=\"\" src=\"/blah.jpg\" src=\"/knowledge/blah.jpg\" border=\"0\" />

Voici le code pour manipuler le code 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;
    }

Lorsque je débogue, et qu'il arrive à la ligne "image.attributs.Remove (" src ");", il existe 2 valeurs "src", comme prévu Après cette ligne, il y a 1 valeur "src", celle qui commence par "/ knowledge". Cependant, je m'attendrais à ce qu'ils soient tous les deux supprimés, car le résumé de Remove indique:

Supprime un attribut de la liste, en utilisant son nom. Si plusieurs attributs portent ce nom, ils seront tous supprimés.

J'ai vérifié le code source pour HtmlAttributeCollection dans CodePlex et la méthode Remove le met en boucle pour supprimer les valeurs, de sorte que tout a l'air qu'il devrait fonctionner.

Est-ce que je me trompe ou ai-je trouvé l'occasion d'offrir un correctif dans HtmlAgilityPack?

Réponse acceptée

Confirmé: image.Attributes.Remove supprime uniquement la première occurrence.

Une solution rapide consiste à appeler Supprimer plusieurs fois. S'il est appelé et que l'attribut n'est pas trouvé, il ne fait rien.

Vous voudrez peut-être informer les auteurs de HtmlAgilityPack à ce sujet.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi