HtmlAgilityPackを使用してHtmlにスタイル属性を追加するより良い方法

c# html html-agility-pack

質問

私はHtmlAgilityPackを使用しています。私はすべてのPタグを検索し、Pタグ内のスタイルに "margin-top:0px"を追加しています。

あなたが見ることができるように、それはちょっとマージントップの属性を "強要"しています。 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");
                }
            }
        }



更新 :アレックスの提案に基づいてコードを修正しました。 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);
}

非常に重要な改善ではありませんが、このコードは私にとっては簡単です。


人気のある回答

まず第一に、あなたが求めるもの以上のものが必要であると確信していますか?アレックスのソリューションは、あなたの現在の問題に対してはうまくいくはずです。

とにかく、AgilityPackにはそのような機能はありませんが、確かに.Net Frameworkにはあります。これは.Net 4用のものです。以前のバージョンを使用している場合は、少し異なるかもしれません。まず、System.Web.dllにはCssStyleCollection Classが付属しています。このクラスには、インラインCSSを解析するのに必要なすべてのビルドが既にCssStyleCollection Classれています。ただ1つのキャッチがあり、コンストラクタは内部的なので、ソリューションは少しハッキーです。最初に、クラスのインスタンスを構築するために必要なのは少し反映です。そのコードはすでにここで行われています 。これは現在動作していますが、.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は合法ですか? はい、理由を学ぶ