使用htmlagility包替換src值

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

我正在為網站使用CMS系統。我的內容貢獻者在系統中放了一些非常大的圖像,然後繼續在cms中調整它們的大小,使它們適合於頁面或文章。當webuser訪問該頁面時,即使貢獻者已調整圖像大小,他們也會下載完整圖像。我找到了一個圖像縮放器插件,我需要做的就是在src中添加圖像名稱後面的width和height參數。進行搜索看起來我應該使用html agility pack來實現這一目標但有人可以幫我完成我的代碼。我已經想出如何在內容中找到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));
    }
}

熱門答案

如果使用僅選擇具有src和寬度或高度的節點的XPath,則可以省略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
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因