Bessere Möglichkeit, Html mit HtmlAgilityPack ein Stilattribut hinzuzufügen

c# html html-agility-pack

Frage

Ich verwende das HtmlAgilityPack. Ich durchsuche alle P-Tags und füge einen "margin-top: 0px" zum Stil innerhalb des P-Tags hinzu.

Wie Sie sehen können, ist das "margin-top" -Attribut "brutal". Es scheint, dass es einen besseren Weg geben muss, dies mit dem HtmlAgilityPack zu tun, aber ich konnte es nicht finden, und die HtmlAgilityPack-Dokumentation ist nicht existent.

Kennt jemand einen besseren Weg?

        HtmlNodeCollection pTagNodes = node.SelectNodes("//p[not(contains(@style,'margin-top'))]");
        if (pTagNodes != null && pTagNodes.Any())
        {
            foreach (HtmlNode pTagNode in pTagNodes)
            {
                if (pTagNode.Attributes.Contains("style"))
                {
                    string styles = pTagNode.Attributes["style"].Value;
                    pTagNode.SetAttributeValue("style", styles + "; margin-top: 0px");
                }
                else
                {
                    pTagNode.Attributes.Add("style", "margin-top: 0px");
                }
            }
        }



UPDATE : Ich habe den Code basierend auf den Vorschlägen von Alex modifiziert. Möchte immer noch wissen, ob es eine eingebaute Funktionalität in HtmlAgilityPack gibt, die die Style-Attribute in einer "DOM" -Methode behandelt.

        const string margin = "; margin-top: 0px";

        HtmlNodeCollection pTagNodes = node.SelectNodes("//p[not(contains(@style,'margin-top'))]");
        if (pTagNodes != null && pTagNodes.Any())
        {
            foreach (var pTagNode in pTagNodes)
            {
                string styles = pTagNode.GetAttributeValue("style", "");
                pTagNode.SetAttributeValue("style", styles + margin);
            }
        }

Akzeptierte Antwort

Sie können Ihren Code ein wenig vereinfachen, indem Sie die HtmlNode.GetAttributeValue Methode verwenden und Ihre magische Magic-Zeichenfolge "margin-top" als Konstante HtmlNode.GetAttributeValue :

const string margin = "margin-top: 0";
foreach (var pTagNode in pTagNodes)
{
    var styles = pTagNode.GetAttributeValue("style", null);
    var separator = (styles == null ? null : "; ");
    pTagNode.SetAttributeValue("style", styles + separator + margin);
}

Keine sehr bedeutende Verbesserung, aber dieser Code ist einfacher als für mich.


Beliebte Antwort

Vor allem, bist du sicher, dass du mehr brauchst als du verlangt hast? Alex Lösung sollte einfach gut für Ihr aktuelles Problem funktionieren, wenn es immer so "einfach" ist, warum sollten Sie mehr Komplexität hinzufügen und hinzufügen?

Übrigens hat das AgilityPack nicht diese Art von Funktion, aber sicherlich hat das .Net Framework. Beachten Sie, dass dies alles für .Net 4 ist, wenn Sie eine frühere Version verwenden, kann es etwas anders sein. Erstens, System.Web.dll kommt mit der CssStyleCollection Class , diese Klasse hat bereits alles CssStyleCollection Class , was Sie für die Analyse von Inline-CSS wünschen, es gibt nur einen Haken, der Konstruktor ist intern, also ist die Lösung ein bisschen "hacky". Zunächst einmal, für den Bau einer Instanz der Klasse alles , was Sie ein bisschen Reflexion müssen, wird der Code für das bereits getan hier . Denken Sie daran, dass dies jetzt funktioniert, aber in einer zukünftigen Version von .Net einbrechen könnte. Alles, was übrig ist, ist wirklich einfach

CssStyleCollection css = CssStyleTools.Create();
css.Value = "border-top:1px dotted #BBB;margin-top: 0px;font-size:12px";
Console.WriteLine(css["margin-top"]); //prints "0px"

Wenn Sie aus irgendeinem Grund keine Referenz zu System.Web hinzufügen können (dies wäre der Fall, wenn Sie .Net 4 Client Profile verwenden), besteht immer die Möglichkeit, Reflector zu verwenden.

Persönlich würde ich mit Alex Lösung gehen, aber es liegt an Ihnen zu entscheiden. :)



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow