2009-12-14 4 views
8

나는 in a codeplex discussion 질문을했지만 여기서는 stackoverflow에서 더 빠른 대답을 얻길 바랍니다.HTML 민첩성 팩 - 특정 노드 다음에 노드 선택

그래서 C#에서 HTML 분석을 위해 HTML 민첩성 팩을 사용합니다. 나는 다음과 같은 HTML 구조가 있습니다

<body> 
    <p class="paragraph">text</p> 
    <p class="paragraph">text</p> 
    <p class="specific">text</p> 
    <p class="paragraph">text</p> 
    <p class="paragraph">text</p> 
</body> 

을 내가 클래스 "특정"와 P 요소 다음에 존재하는 클래스 "항"모든 페이지 요소를 얻을 필요가있다.

할 방법이 있습니까?

감사합니다.

답변

6

시도 (적절한 무엇이든, 그 나던 존재하는 경우 대체)

사용 SkipWhile

예를 들어, LINQPad에 당신이 얻을 5,6,7에서 :

int[] a = { 6, 5, 6 ,7 }; 
a.SkipWhile(x=>x!=6).Skip(1).Dump(); 

그래서, 유형 SelectNodes 반환에 따라 다음 중 하나를

.SelectNodes("/p").SkipWhile(p => p.Class != "specific").Skip(1) 

또는

.SelectNodes("/p").Cast<XX>().SkipWhile(p => p.Class != "specific").Skip(1) 

(또는, 추한 버전)

.SelectNodes("/p").SkipWhile(p => ((XX)p).Class != "specific").Skip(1) 

(또는 경우에 - 당신의 표현은 이미 적절하게 필터링되어 있지 않은 경우)

.SelectNodes("/p").OfType<XX>().SkipWhile(p => p.Class != "specific").Skip(1) 

편집 :

static class HapExtensions 
{ 
    public IEnumerable<T> SkipUntilAfter(this IEnumerable<T> sequence, Predicate<T> predicate) { 
     return sequence.SkipWhile(predicate).Skip(1); 
     } 
} 

누구든지 이것에 대한 선행 기술을 검색하는 신경 : 아마 확장 메서드를 만들 것 ? 좋은 이름 제안?

+0

SkipWhile is cool +1 –

+0

이것은 내가 필요한 것입니다. 감사. – morsanu

+0

나도 곧 사용할거야. 물어봐 줘서 고마워! –

2

마크의 예에서와 같이의 .class를 사용하여이

bool latterDayParagraphs = false; 
List<DocumentNode> nodes = new List<DocumentNode>(); 
foreach(var pElement in doc.DocumentNode.SelectNodes("/p")) 
{ 
    if(pElement.Class != "paragraph") 
    { 
     latterDayParagraphs = true; 
     continue; 
    } 
    if(latterDayParagraphs) 
    { 
     nodes.Add(pElement); 
    } 
} 
+0

질문을 실제로 살펴 보지 않았을 것 같습니다. :) HTML 민첩성 팩을 사용하여 C#에서 HTML을 구문 분석하고 class = "specific"인 p 태그 다음에있는 class = "paragraph"가있는 p 태그 만 선택해야합니다. – morsanu

+0

죄송합니다.이 답변이 더 유용 할 것입니다 (System.Linq에 대한 참조가 필요합니다). :) –

+0

그러면 모든 p 태그를 "단락"클래스로 선택하게됩니다. class = "specific"인 p 태그 다음에 오는 태그 만 필요합니다. – morsanu

관련 문제