Использование пакета htmlagility для замены значений src

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

Вопрос

Я использую систему CMS для веб-сайта. Мои контент-консультанты внедрили в систему очень тяжелые изображения, а затем изменили их размеры в cms, чтобы они соответствовали странице или статье. Когда веб-пользователь попадает на эту страницу, они загружают полное изображение, даже несмотря на то, что вкладчик изменил размер изображения. Я нашел плагин resizer изображения, и все, что мне нужно сделать, это добавить параметры ширины и высоты за именем изображения в src. Выполняя поиск, похоже, что я должен использовать пакет гибкости html для этого, но может кто-то помочь мне закончить мой код. Ive выяснил, как найти теги img в контенте, но я не знаю, как добавить src с шириной и высотой.

Старый тег

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

Для этого - изменилось значение src

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

Это мой код до сих пор. Все, что мне нужно, - это помощь в выражении if, чтобы сказать, если тег img содержит ширину или высоту, добавьте их в атрибут 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
    }
}

Принятый ответ

Попробуй это:

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

Популярные ответы

Если вы используете XPath, который выбирает только узлы с src и шириной или высотой, вы можете опустить if:

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

но будьте осторожны: SelectNodes возвращает null, если ничего не соответствует - насколько я помню HtmlAgilityPack.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему