Atributos de HtmlAgilityPack. Eliminar solo en la imagen elimina uno, cuando hay dos

attributes c# html-agility-pack

Pregunta

Estoy usando HtmlAgilityPack en nuestro proyecto, de modo que pueda mostrar algunos HTML de otro de nuestros sistemas. Me encontré con este problema en mi prueba de unidad, y quiero asegurarme de que no estoy haciendo algo mal. Si tengo una imagen y tiene 2 valores "src", me gustaría elegir una, eliminarlas y agregar una de nuevo con la ruta correcta. No creo que esto suceda con nuestro Html, pero por si acaso ...

Entonces, aquí hay un ejemplo de etiqueta de imagen:

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

Aquí está el código para manipular el 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;
    }

Cuando depuro, y llega a la línea "image.Attributes.Remove (" src ");", hay 2 valores de "src", como se esperaba. Después de que se ejecuta esa línea, hay 1 valor "src" allí, el que comienza con "/ knowledge". Sin embargo, espero que se eliminen ambos, ya que el resumen de Eliminar dice:

Elimina un atributo de la lista, utilizando su nombre. Si hay más de un atributo con este nombre, se eliminarán todos.

Revisé el código fuente de HtmlAttributeCollection en CodePlex, y el método Remove lo coloca en un bucle para eliminar los valores, por lo que todo parece que debería funcionar.

¿Estoy utilizando este error o he encontrado la oportunidad de ofrecer un parche en HtmlAgilityPack?

Respuesta aceptada

Confirmado: image.Attributes.Remove solo elimina la primera aparición.

Una solución rápida es llamar a Eliminar varias veces. Si se llama y no se encuentra el atributo, no hace nada.

Es posible que desee que los autores de HtmlAgilityPack sepan esto.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué