HtmlAgilityPack을 사용하여 태그 노드에서 클래스 이름 제거

c# html html-agility-pack xpath

문제

html에서 특정 클래스 이름을 제거해야합니다. 예를 들면 다음과 같습니다.

<table class="removeme"></table>

청소 후 지정한 클래스 "removeme"및 html을 제거 할 수있는 코드를 잘라야합니다.

<table></table>

또한 전달 된 HTML에는 다음과 같은 내용이 포함될 수 있음을 명심하십시오.

<table class="removeme leaveme"></table>

청소 후에는 다음과 같이 나타납니다.

<table class="leaveme"></table>

수락 된 답변

이것을 두 단계로 처리 할 수 ​​있습니다. 먼저 'removeme` 클래스 속성 만있는 모든 노드를 가져온 다음 모든 클래스 속성을 제거하십시오.

//*[normalize-space(@class)='removeme']

다음 단계에서 removeme 클래스와 다른 클래스를 가진 모든 노드를 얻은 다음 클래스 속성에서 removeme 를 제거합니다.

//*[
     normalize-space(@class)!='removeme'
        and
     contains(concat(' ', normalize-space(@class), ' '), ' removeme ')
   ]

위의 XPath의 첫 번째 조건은 1 단계에서 처리되지 않은 모든 노드를 가져오고 두 번째 조건은 CSS 선택기 .removeme 해당하는 XPath입니다.

다음은 완전한 콘솔 예제입니다.

var xml = @"<root>
    <table class=""removeme""></table>
    <table class=""removeme leaveme""></table>
    <table class="" removeme ""></table>
</root>";
var doc = new HtmlDocument();
doc.LoadHtml(xml);
var removemeOnly = doc.DocumentNode.SelectNodes("//*[normalize-space(@class)='removeme']");
foreach (HtmlNode node in removemeOnly)
{
    node.Attributes["class"].Remove();
}
var containsRemoveme =
    doc.DocumentNode.SelectNodes("//*[normalize-space(@class)!='removeme' and contains(concat(' ', normalize-space(@class), ' '), ' removeme ')]");
foreach (HtmlNode node in containsRemoveme)
{
    node.Attributes["class"].Value = node.Attributes["class"].Value.Replace("removeme", "");
}
//print formatted HTML output (don't use this for non XML-compliant HTML)
Console.WriteLine(XDocument.Parse(doc.DocumentNode.OuterHtml));


Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow