Attributi HtmlAgilityPack.Rimuovi solo sull'immagine rimuove uno, quando ce ne sono due

attributes c# html-agility-pack

Domanda

Sto usando HtmlAgilityPack nel nostro progetto, in modo da poter visualizzare alcuni Html da un altro dei nostri sistemi. Ho esaminato questo problema durante i miei test unitari e voglio essere sicuro che non stia facendo qualcosa di sbagliato. Se ho un'immagine, e ha 2 valori "src", mi piacerebbe sceglierne una, rimuoverle entrambe e aggiungerne una di nuovo con il percorso corretto. Non penso che questo accadrà con il nostro Html, ma nel caso ....

Quindi, ecco un tag immagine di esempio:

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

Ecco il codice per manipolare l'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;
    }

Quando eseguo il debug e arriva alla riga "image.Attributes.Remove (" src ");", ci sono 2 valori "src", come previsto. Dopo aver eseguito quella linea, c'è 1 valore "src", quello che inizia con "/ knowledge". Tuttavia, mi aspetto che vengano rimossi entrambi, dal momento che il riepilogo di Remove dice:

Rimuove un attributo dall'elenco, usando il suo nome. Se ci sono più di un attributo con questo nome, saranno tutti rimossi.

Ho controllato il codice sorgente per HtmlAttributeCollection in CodePlex e il metodo Remove lo mette in loop per rimuovere i valori, quindi tutto sembra funzionare correttamente.

Sto usando questo sbagliato, o ho trovato l'opportunità di offrire una patch in HtmlAgilityPack?

Risposta accettata

Confermato: image.Attributes.Remove rimuove solo la prima occorrenza.

Una soluzione rapida è chiamare Rimuovi più volte. Se viene chiamato e l'attributo non viene trovato, non fa nulla.

Potresti far sapere agli autori di HtmlAgilityPack di questo.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché