5

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


更新:Alexの提案に基づいてコードを変更しました。より「DOM」の方法でスタイル属性を処理するHtmlAgilityPackにいくつかの組み込み機能があるかどうかを知りたいです。

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メソッドを使用し、「マージントップ」マジックストリングを定数として作成することで、コードを少し単純化できます。

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

まず第一に、あなたはあなたがあなたが求めたものより多くを必要としていると確信していますか?Alexのソリューションは、現在の問題に対しては問題なく機能するはずです。それが常に「単純」である場合、なぜ面倒で複雑さを増すのでしょうか。

とにかく、AgilityPackにはそのような機能はありませんが、確かに.NetFrameworkにはあります。これはすべて.Net4の場合であることに注意してください。以前のバージョンを使用している場合は、状況が少し異なる可能性があります。まず、System.Web.dllにはが付属してCssStyleCollection Classいます。このクラスには、インラインcssの解析に必要なすべてのものが既に組み込まれています。キャッチは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クライアントプロファイルを使用している場合)、Reflectorを使用する可能性が常にあります。

個人的にはAlexのソリューションを使用しますが、決定するのはあなた次第です。:)

于 2012-08-22T21:36:23.593 に答える