2009-12-14 26 views
8

Tôi đã đặt câu hỏi in a codeplex discussion nhưng tôi hy vọng sẽ nhận được câu trả lời nhanh hơn ở đây tại stackoverflow.HTML Agility Pack - Chọn các nút sau nút cụ thể

Vì vậy, tôi sử dụng Gói nhanh nhẹn HTML để phân tích HTML trong C#. tôi có cấu trúc html sau:

<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> 

Và tôi cần để có được tất cả các yếu tố p với lớp "đoạn" mà tồn tại sau khi các yếu tố p với lớp "đặc biệt".

Có cách nào để làm điều đó không?

Cảm ơn.

Trả lời

6

sử dụng .class như trong ví dụ của Mark (nếu điều đó không tồn tại, thay thế bất cứ điều gì là thích hợp)

Sử dụng SkipWhile

ví dụ trong LINQPad bạn nhận được 5,6,7 từ:

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

Vì vậy, tùy thuộc vào loại SelectNodes lợi nhuận, hoặc là:

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

hoặc

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

(hoặc phiên bản xấu xí)

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

(hoặc trong một số trường hợp - không nếu biểu hiện của bạn đã được lọc một cách thích hợp)

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

EDIT: Tôi có lẽ muốn tạo ra một phương pháp khuyến nông:

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

Bất cứ ai quan tâm đến việc tìm kiếm lên tình trạng kỹ thuật cho điều này ? Bất kỳ đề xuất tên tốt nào?

+0

SkipWhile thật thú vị +1 –

+0

Đây chính xác là những gì tôi cần. Cảm ơn. – morsanu

+0

Tôi sẽ sớm sử dụng nó, vì vậy cảm ơn vì đã hỏi! –

2

Hãy thử điều này

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

Tôi đoán bạn vừa xem qua câu hỏi, không thực sự đọc câu hỏi đó. :) Tôi phân tích cú pháp HTML trong C# bằng HTML Agility Pack và tôi chỉ cần chọn các thẻ p có class = "paragraph" sau thẻ p với class = "specific". – morsanu

+0

Xin lỗi về điều đó, hy vọng câu trả lời này hữu ích hơn (bạn sẽ cần tham chiếu đến System.Linq). :) –

+0

Điều đó sẽ chọn TẤT CẢ các thẻ p với lớp "đoạn". Tôi chỉ cần những cái sau SAU thẻ p với class = "specific". – morsanu

Các vấn đề liên quan