Usando el paquete htmlagility para reemplazar los valores src

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

Pregunta

Estoy usando un sistema CMS para un sitio web. Mis colaboradores de contenido han puesto algunas imágenes muy pesadas en el sistema y luego han cambiado el tamaño de las mismas en cms para que sean apropiadas para la página o el artículo. Cuando un usuario de Internet accede a esa página, descarga la imagen completa, aunque el colaborador haya cambiado el tamaño de la imagen. He encontrado un complemento para cambiar el tamaño de la imagen, y todo lo que necesito hacer es agregar los parámetros de ancho y alto detrás del nombre de la imagen en src. Al hacer una búsqueda, parece que debería estar usando el paquete de agilidad html para lograr esto, pero alguien puede ayudarme a terminar mi código. He descubierto cómo encontrar las etiquetas img dentro del contenido, pero no sé cómo agregar src con el ancho y la altura.

Etiqueta antigua

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

A esto - aviso src valor ha cambiado

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

Este es mi código hasta ahora. Todo lo que necesito es ayuda dentro de la sentencia if para decir si la etiqueta img contiene un ancho o una altura, agregue esos al atributo 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
    }
}

Respuesta aceptada

Prueba esto:

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

Respuesta popular

Si usa un XPath que selecciona solo nodos con src y ancho o alto, puede omitir el if:

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

pero tenga cuidado: SelectNodes devuelve nulo, si nada coincide, por lo que recuerdo HtmlAgilityPack.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow