6

我正在为网站使用 CMS 系统。我的内容贡献者在系统中放置了一些非常大的图像,然后继续在 cms 中调整它们的大小,以便它们适合页面或文章。当网络用户点击该页面时,他们会下载完整的图像,即使贡献者已经调整了图像的大小。我找到了一个图像调整器插件,我需要做的就是在 src 中的图像名称后面添加宽度和高度参数。进行搜索看起来我应该使用 html 敏捷包来实现这一点,但有人可以帮我完成我的代码。我想出了如何在内容中找到 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
    }
}
4

2 回答 2

12

试试这个:

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));
    }
}
于 2012-07-09T21:06:05.620 回答
2

如果您使用的 XPath 仅选择具有 src 和宽度或高度的节点,则可以省略 if:

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

但要小心:SelectNodes 返回 null,如果没有匹配项 - 据我记得 HtmlAgilityPack。

于 2012-07-09T21:12:43.513 回答