使用HtmlAgilityPack将样式属性添加到Html的更好方法

c# html html-agility-pack

我正在使用HtmlAgilityPack。我正在搜索所有P标签并在P标签内的样式中添加“margin-top:0px”。

正如你所看到的那样,它有点“强制”使用margin-top属性。似乎必须有一个更好的方法来使用HtmlAgilityPack,但我找不到它,并且HtmlAgilityPack文档不存在。

有人知道更好的方法吗?

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



更新 :我已根据Alex的建议修改了代码。仍然想知道HtmlAgilityPack中是否有一些内置功能可以以更“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);
            }
        }

一般承认的答案

您可以使用HtmlNode.GetAttributeValue方法稍微简化您的代码,并使您的“margin-top”魔术字符串保持不变:

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

这不是一个非常显着的改进,但这个代码对我来说更简单。


热门答案

首先,你确定你需要的不仅仅是你要求的吗? Alex解决方案应该能够很好地解决您当前的问题,如果它总是“简单”,为什么要麻烦并增加它的复杂性呢?

不管怎样,AgilityPack没有那种功能,但是.Net Framework肯定有。请注意,这仅适用于.Net 4,如果您使用的是早期版本,则可能会有所不同。首先,System.Web.dll附带了CssStyleCollection Class ,这个类已经包含了你想要解析内联css的所有内容,只有一个catch,它的构造函数是内部的,所以解决方案有点“hacky”。首先,为构建一个类的实例,你需要的只是一些反思,其代码已在这里完成。请记住,这现在可以正常工作,但可能会破坏.Net的未来版本。剩下的就是这么简单

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

如果由于某种原因你不能添加对System.Web的引用(如果你使用.Net 4 Client Profile就是这种情况),总是有可能使用Reflector。

就个人而言,我会选择亚历克斯的解决方案,但这取决于你的决定。 :)



Related

许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow