HtmlAgilityPack을 사용하여 Html에 스타일 속성을 추가하는 더 나은 방법

c# html html-agility-pack

문제

HtmlAgilityPack을 사용하고 있습니다. 모든 P 태그를 검색하고 P 태그 내의 스타일에 "margin-top : 0px"를 추가합니다.

보시다시피, margin-top 속성과 같은 "brute forcing"일 수 있습니다. 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");
                }
            }
        }



업데이트 : 알렉스의 제안에 따라 코드를 수정했습니다. 더 "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);
            }
        }

수락 된 답변

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에는 분명히 있습니다. 이것은 넷용입니다. 넷용, 이전 버전을 사용한다면 조금 다를 수 있습니다. 우선, 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을 사용하는 경우) 리플렉터를 사용할 가능성이 항상 있습니다.

개인적으로 나는 Alex의 해결책을 가지고 갈 것이지만 결정은 당신에게 달렸습니다. :)




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.