使用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”的方式處理樣式屬性。

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

一般承認的答案

您可以使用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。

就個人而言,我會選擇亞歷克斯的解決方案,但這取決於你的決定。 :)




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因