Ich benutze das HtmlAgilityPack. Ich durchsuche alle P-Tags und füge dem Stil innerhalb des P-Tags ein "margin-top: 0px" hinzu.
Wie Sie sehen, ist es ein bisschen "brachial", das margin-top-Attribut zu erzwingen. Es scheint, dass es eine bessere Möglichkeit geben muss, dies mit dem HtmlAgilityPack zu tun, aber ich konnte es nicht finden, und die HtmlAgilityPack-Dokumentation ist nicht vorhanden.
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 Alex 'Vorschlägen geändert. Ich würde immer noch gerne wissen, ob es in HtmlAgilityPack eine integrierte Funktionalität gibt, die die Stilattribute auf eine "DOM" Weise handhabt.
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);
}
}
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.
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. :)