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의 제안에 따라 코드를 수정했습니다. 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);
}
매우 중요한 개선은 아니지만이 코드는 나만큼 단순합니다.
우선, 당신이 요구 한 것 이상을 필요로 하시겠습니까? 알렉스 솔루션은 항상 현재의 문제에 대해 잘 작동해야합니다. 문제가 더 복잡하고 복잡해지면 항상 "간단합니다".
어쨌든 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의 해결책을 가지고 갈 것이지만 결정은 당신에게 달렸습니다. :)