Verwenden Sie das Paket htmlagility, um die src-Werte zu ersetzen

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

Frage

Ich benutze ein CMS-System für eine Website. Meine Mitwirkenden haben einige sehr heftige Bilder in das System eingefügt und sind dann daran gegangen, sie in den cms zu skalieren, so dass sie für die Seite oder den Artikel geeignet sind. Wenn ein Webuser auf diese Seite klickt, wird das gesamte Bild heruntergeladen, obwohl der Benutzer die Größe des Bilds geändert hat. Ich habe ein Bild Resizer-Plugin gefunden, und alles, was ich tun muss, ist, die Breite und Höhe Parameter hinter dem Bildnamen in src hinzuzufügen. Bei einer Suche sieht es so aus, als würde ich das HTML-Agility-Paket verwenden, um dies zu erreichen, aber jemand kann mir helfen, meinen Code fertigzustellen. Ich habe herausgefunden, wie man die IMG-Tags innerhalb des Inhalts findet, aber ich weiß nicht, wie man src mit der Breite und Höhe anhängen kann.

Alter Tag

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

Dazu - Hinweis src Wert hat sich geändert

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

Das ist bisher mein Code. Alles, was ich brauche, ist Hilfe in der if-Anweisung, um zu sagen, ob das img-Tag eine Breite oder eine Höhe enthält, und diese an das src-Attribut anhängen.

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

Akzeptierte Antwort

Versuche dies:

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

Beliebte Antwort

Wenn Sie einen XPath verwenden, der nur Knoten mit src und Breite oder Höhe auswählt, können Sie das if weglassen:

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

Aber Vorsicht: SelectNodes gibt null zurück, wenn nichts passt - soweit ich mich an HtmlAgilityPack erinnere.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum