HtmlAgilityPack Attribute.Entfernt nur das Bild Entfernt eins, wenn zwei vorhanden sind

attributes c# html-agility-pack

Frage

Ich verwende HtmlAgilityPack in unserem Projekt, so dass ich etwas HTML von einem anderen unserer Systeme anzeigen kann. Ich habe dieses Problem bei meinen Unit-Tests untersucht und möchte sicherstellen, dass ich nichts falsch mache. Wenn ich ein Bild habe und es zwei "src" -Werte hat, möchte ich eins auswählen, beide entfernen und eins mit dem richtigen Pfad hinzufügen. Ich denke nicht, dass dies mit unserer HTML passieren wird, aber nur für den Fall ....

Also, hier ist ein Beispielbild-Tag:

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

Hier ist der Code zum Bearbeiten des 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;
    }

Wenn ich debugge, und es zu der Zeile "image.Attributes.Remove (" src ");" kommt, gibt es 2 "src" -Werte wie erwartet. Nachdem diese Zeile ausgeführt wurde, gibt es dort einen "src" -Wert, der mit "/ knowledge" beginnt. Allerdings würde ich erwarten, dass beide entfernt werden, da die Zusammenfassung für Remove sagt:

Entfernt ein Attribut aus der Liste mit seinem Namen. Wenn mehrere Attribute mit diesem Namen vorhanden sind, werden sie alle entfernt.

Ich habe den Quellcode für die HtmlAttributeCollection in CodePlex überprüft und die Remove-Methode durchläuft eine Schleife, um die Werte zu entfernen, sodass alles so aussieht, als ob es funktionieren sollte.

Verwende ich das falsch oder habe ich eine Möglichkeit gefunden, einen Patch in HtmlAgilityPack anzubieten?

Akzeptierte Antwort

Bestätigt: image.Attributes.Remove entfernt nur das erste Vorkommen.

Eine schnelle Lösung besteht darin, mehrere Male Remove aufzurufen. Wenn es aufgerufen wird und das Attribut nicht gefunden wird, tut es nichts.

Vielleicht möchten Sie die HtmlAgilityPack-Autoren darüber informieren.



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow