Лучший способ добавить атрибут стиля в Html с помощью HtmlAgilityPack

c# html html-agility-pack

Вопрос

Я использую HtmlAgilityPack. Я просматриваю все теги P и добавляю «margin-top: 0px» к стилю в теге P.

Как вы видите, это любопытное «грубое форсирование» атрибута 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");
                }
            }
        }



ОБНОВЛЕНИЕ : я изменил код, основанный на предложениях Алекса. Хотелось бы узнать, есть ли в 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 должно просто отлично работать для вашей текущей проблемы, если это всегда так «просто», зачем беспокоиться и добавить к ней больше сложностей?

Anway, AgilityPack не имеет такой функции, но, безусловно, имеет .Net Framework. Обратите внимание, что это все для .Net 4, если вы используете более раннюю версию, все может быть немного иначе. Во-первых, System.Web.dll поставляется с CssStyleCollection Class , у этого класса уже есть все, что вам нужно для синтаксического анализа встроенного css, есть только один catch, его конструктор является внутренним, поэтому решение немного «взломанно». Во-первых, для построения экземпляр класса, в котором вы нуждаетесь, немного отражается, код для этого уже был сделан здесь . Просто имейте в виду, что это работает сейчас, но может сломаться в будущей версии .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
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему