2011-05-04 4 views
0

주어진 클래스가있는 모든 요소를 ​​선택하고 HTML 문자열에서 제거하려고합니다.Agility Pack을 사용하여 클래스가 지정된 HTML에서 모든 요소 제거

이것은 소스가 분명히 클래스 이름을 가진 4 개의 요소를 보여 주지만 지금까지 내가 제거한 것 같지 않습니다.

// Filter page HTML to display required content 
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 

// filePath is a path to a file containing the html 
htmlDoc.LoadHtml(pageHTML); 

// ParseErrors is an ArrayList containing any errors from the Load statement); 
if (!htmlDoc.ParseErrors.Any()) 
{ 
    // Remove all elements marked with pdf-ignore class 
    HtmlNodeCollection nodes = htmlDoc.DocumentNode.SelectNodes("//body[@class='pdf-ignore']"); 

    // Remove the collection from above 
    foreach (var node in nodes) 
    { 
     node.Remove(); 
    } 
} 

편집 : 문서를 구문 분석하고 SelectNodes 라인은 단지 아무것도 반환하지 명중되고 그냥 명확하게.

<input type=\"submit\" name=\"ctl00$MainContent$PrintBtn\" value=\"Print Shotlist\" onclick=\"window.print();\" id=\"MainContent_PrintBtn\" class=\"pdf-ignore\"> 

답변

2

편집 : 업데이트 된 대답은 당신이 HTML 문자열 <input> 요소 선언의 일부를 게시,하지만 당신은 (표현식 //body[@class='pdf-ignore']에 따라) 클래스 pdf-ignore<body> 요소를 일치하도록 노력하고 있습니다. 당신의 노드를 얻을 수

var nodes = htmlDoc.DocumentNode.SelectNodes("//*[contains(@class,'pdf-ignore')]"); 

코드 :

당신은 모든 당신이 사용해야하는이 클래스와 문서에서 요소를 일치 시키려면

. 클래스 이름이 지정된 모든 요소와 일치합니다.

코드을 제외하고 코드가 정확하다고 보입니다. ParseErrors 속성 (유형이 IEnumerable<HtmlParseError>)이 null 인 경우에만 노드를 선택하고 제거하지만 실제로이 속성을 찾을 수없는 경우 빈 목록을 반환합니다. 코드를 다음과 같이 변경하면

if (!htmlDoc.ParseErrors.Any()) 
{ 
    // some logic here 
} 

이 해결됩니다.

+0

나는 실제로 이것을 알아 차 렸습니다. 질문을 업데이트했습니다. 그것은 비록 어떤 노드를 반환하지 않습니다. 내 요소는 문서 내의 여러 위치에 있으며 모두 제거하려고합니다. 나는 @를 생략하려고 시도했지만 아무 것도 고르지 않습니다. – Andrew

+0

@Andi, HTML 문자열을 게시 할 수 있습니까? 또한 업데이트 된 질문에 컬렉션에 적어도 하나의 요소가 있다면'true' 인'htmlDoc.ParseErrors.Any()'조건을 사용합니다 (여기에 적어도 하나의 오류가 있습니다). – Alex

+0

도움을 주셔서 감사합니다. – Andrew

0

당신의 XPath는 아마 일치되지 않은 : 여기

는 HTML의 조각 당신이 "//div[class='pdf-ignore']" (더 "@")을 시도하지 않은?

+0

그 중 하나가 작동하지 않습니다. – Andrew

관련 문제