5

我正在使用 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);
    }
}
4

2 回答 2

5

您可以通过使用方法稍微简化代码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);
}

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

于 2012-08-22T13:02:16.223 回答
3

首先,你确定你需要的比你要求的多吗?亚历克斯解决方案应该可以很好地解决您当前的问题,如果它总是那么“简单”,为什么还要麻烦并增加更多复杂性呢?

无论如何,AgilityPack 没有这种功能,但 .Net 框架肯定有。请注意,这仅适用于 .Net 4,如果您使用的是早期版本,情况可能会有所不同。首先,System.Web.dll 附带CssStyleCollection Class,这个类已经包含了解析内联 css 所需的所有内容,只有一个问题,它的构造函数是内部的,所以解决方案有点“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 客户端配置文件,就会出现这种情况),总有可能使用 Reflector。

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

于 2012-08-22T21:36:23.593 回答