Utilizzo del pacchetto htmlagility per sostituire i valori di src

c# html html-agility-pack html-manipulation src

Domanda

Sto usando un sistema CMS per un sito web. I miei contributori di contenuti hanno messo alcune immagini molto pesanti nel sistema e sono poi passate a ridimensionarle nel cms in modo che siano appropriate per la pagina o l'articolo. Quando un utente web colpisce questa pagina, scarica l'immagine completa, anche se il contributore ha ridimensionato l'immagine. Ho trovato un plug-in Image Resizer e tutto ciò che devo fare è aggiungere i parametri width e height dietro il nome dell'immagine in src. Facendo una ricerca sembra che dovrei usare il pacchetto di agilità html per raggiungere questo obiettivo, ma qualcuno può aiutarmi a completare il mio codice. Ho capito come trovare i tag img all'interno del contenuto, ma non so come aggiungere src con la larghezza e l'altezza.

Vecchio tag

<img src="/IMG_3556E__sq2.jpg?n=9418" id="/IMG_3556E__sq2.jpg?n=9418" width="83px" height="83px" />

Per questo - è stato modificato il valore di src

<img src="/IMG_3556E__sq2.jpg?width=83&amp;height=83" id="/IMG_3556E__sq2.jpg?n=9418" width="83px" height="83px" />

Questo è il mio codice finora. Tutto ciò di cui ho bisogno è l'aiuto all'interno dell'istruzione if per dire se il tag img contiene una larghezza o un'altezza, aggiungere quelli all'attributo src.

ContentManager contentManager = new ContentManager();
ContentData Content = contentManager.GetItem(id);

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(Content.Html);

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//img/@src"))
{
    if (//img has a width or height, it means image has been resized) {
        //append that nodes src within the content.html with the ?width=x&height=x
    }
}

Risposta accettata

Prova questo:

static void Main(string[] args)
{
    var htmlDoc = new HtmlDocument();
    htmlDoc.Load(@"E:\Libs\HtmlAgilityPack.1.4.0\htmldoc.html");

    foreach(HtmlNode node in htmlDoc.DocumentNode
                                   .SelectNodes("//img[@src and (@width or @height)]"))
    {
        var src = node.Attributes["src"].Value.Split('?');

        var width = node.Attributes["width"].Value.Replace("px", "");

        var height = node.Attributes["height"].Value.Replace("px", "");

        node.SetAttributeValue("src",
                                src[0] +
                                string.Format("?width={0}&height{1}", width, height));
    }
}

Risposta popolare

Se si utilizza un XPath che seleziona solo nodi con src, larghezza o altezza, è possibile omettere il se:

foreach (HtmlNode node in doc.DocumentNode
    .SelectNodes("//img[@src and (@width or @height)]"))
{
    node.SetAttributeValue("src",  ...);
}

ma attenzione: SelectNodes restituisce null, se non corrisponde nulla, per quanto ricordo HtmlAgilityPack.




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é