Utiliser htmlagility pack pour remplacer les valeurs src

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

Question

J'utilise un système de gestion de contenu pour un site Web. Mes contributeurs au contenu ont inséré des images très volumineuses dans le système et les ont ensuite redimensionnées dans le cms pour les adapter à la page ou à l'article. Lorsqu'un utilisateur Web accède à cette page, il télécharge la totalité de l'image, même si le contributeur a redimensionné l'image. J'ai trouvé un plugin de traitement d'image, et tout ce que j'ai à faire est d'ajouter les paramètres width et height derrière le nom de l'image dans src. En faisant une recherche, il semble que je devrais utiliser le pack d'agilité html pour y parvenir, mais quelqu'un peut-il m'aider à finir mon code J'ai compris comment trouver les balises img dans le contenu, mais je ne sais pas comment ajouter src avec la largeur et la hauteur.

Vieux tag

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

Pour cela - notez que la valeur src a changé

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

Ceci est mon code jusqu'à présent. Tout ce dont j'ai besoin, c'est de l'aide dans l'instruction if pour indiquer si la balise img contient une largeur ou une hauteur, ajoutez-les à l'attribut 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
    }
}

Réponse acceptée

Essaye ça:

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));
    }
}

Réponse populaire

Si vous utilisez un XPath qui sélectionne uniquement les nœuds avec src et width ou height, vous pouvez omettre le if:

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

mais faites attention: SelectNodes renvoie null, si rien ne correspond - autant que je me souvienne de HtmlAgilityPack.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow