Meilleur moyen d'ajouter un attribut de style Html à l'aide de HtmlAgilityPack
Je suis en utilisant le HtmlAgilityPack. Je suis à la recherche à travers toutes les balises P et l'ajout d'un "margin-top: 0px" le style dans la balise P.
Comme vous pouvez le voir c'est un peu de "force brute" margin-top attribut. Il semble qu'il y a à être une meilleure façon de le faire à l'aide de la
HtmlAgilityPack mais je ne pouvais pas le trouver, et le HtmlAgilityPack la documentation est inexistante.
Quelqu'un connais un meilleur moyen?
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");
}
}
}
Mise à JOUR: j'ai modifié le code en fonction d'Alex suggestions. Voudrais quand même savoir si il y a un certain intégré
la fonctionnalité dans HtmlAgilityPack qui va gérer les attributs de style en plus "DOM".
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);
}
}
OriginalL'auteur Gene S | 2012-08-21
Vous devez vous connecter pour publier un commentaire.
Vous pouvez simplifier votre code un peu en utilisant
HtmlNode.GetAttributeValue
méthode, et de faire de votre "margin-top" la magie de la chaîne constante:Pas une amélioration très significative, mais ce code est plus simple pour moi.
S, je doute vraiment AgilityPack peut analyser le contenu de la
style
attribut. Mais vous pouvez essayer de diviser la valeur de l'attribut par un point-virgule (;
) char à l'aide destring.Split
de la méthode, processus de ces valeurs, et pack les valeurs puis en utilisantstring.Join
.J'ai pensé à ce sujet. Je vais peut-être créer des méthodes d'extension de sorte qu'il semble cuit dans le AgilityPack. Merci pour vos commentaires.
OriginalL'auteur Alex
Tout d'abord, êtes-vous sûr que vous avez besoin de plus que ce que vous avez demandé? Alex solution devrait fonctionner parfait pour votre problème actuel, si c'est toujours que de "simples" pourquoi s'embêter et ajouter plus de complexité?
Anway, le AgilityPack n'a pas ce genre de fonction, mais sûrement, le .Net Framework. Remarque c'est tout pour le .Net 4, si vous utilisez une version antérieure, les choses peuvent être un peu différentes.
D'abord, System.Web.dll vient avec le
CssStyleCollection Classe
, cette classe a déjà tout ce construire en de ce que vous pourriez souhaiter pour analyse de css, il y a juste un hic, c'est le constructeur est interne donc la solution est un peu "hacky".Tout d'abord, pour la construction d'une instance de la classe tous vous avez besoin est un peu de réflexion, le code qui a déjà été fait ici. Il suffit de garder à l'esprit que cela fonctionne maintenant, mais pourrait se briser dans une future version de .Net.
Tout ce qui reste est vraiment facile
SI vous ne pouvez pas pour une raison quelconque ajouter une référence à System.Web (ce serait le cas si vous êtes en utilisant .Net 4 Profil du Client) il y a toujours la possibilité d'utiliser un Réflecteur.
Personnellement, j'irais avec Alex solution, mais c'est à vous de décider. 🙂
OriginalL'auteur shriek