htmlagility packを使用してsrc値を置き換える

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

質問

私はウェブサイトにCMSシステムを使用しています。私のコンテンツ提供者は、非常に重いイメージをシステムに入れて、ページや記事に適したようにCMSでサイズを変更しました。 Webユーザーがそのページにアクセスすると、コントリビュータがイメージのサイズを変更したにもかかわらず、フルイメージがダウンロードされます。画像リサイズプラグインが見つかりました。srcの画像名の後ろに幅と高さのパラメータを追加するだけです。検索を行うと、これを達成するためにhtml agilityパックを使用する必要がありますが、誰かが私のコードを完成させるのに役立つように見えます。私はどのようにコンテンツ内の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とwidthまたはheightのノードのみを選択するXPathを使用する場合は、if:

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

しかし、注意してください:SelectNodesは、一致するものがなければnullを返します。HtmlAgilityPackを覚えている限りです。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow