2011-08-04 31 views
6

tôi nhận được phản ứng web và sử dụng StreamReader để có được những câu trả lời như là một chuỗicách hiệu quả để tìm chuỗi với StreamReader

mã của tôi là

HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 
StreamReader reader = new StreamReader(response.GetResponseStream()); 
string strResponse = reader.ReadToEnd(); 

mẫu của chuỗi là

<div class="box-round"> 
<ol style="list-style-type: decimal;list-style-position:outside;margin-left:42px;"> 
<li>Order ID #A123456 already exists: Update performed 
</ol> 
</div> 

hoặc

<div class="box-round"> 
    <ol style="list-style-type: decimal;list-style-position:outside;margin-left:42px;"> 
    <li>New order created 
    </ol> 
</div> 

Tôi muốn xác định vị trí dòng sau trong chuỗi

Order ID #A123456 already exists: Update performed 

hoặc

New order created 

Đây có phải là cách tốt nhất để tìm kiếm các dòng (s)

while (!reader.EndOfStream) 
    { 
     line = reader.ReadLine(); 
     if (!string.IsNullOrEmpty(line)) 
     { 

     } 
    } 
+6

Bạn' phân tích lại HTML? Nói chung, bạn nên sử dụng trình phân tích cú pháp HTML. [HTML Agility Pack] (http://htmlagilitypack.codeplex.com/) có thể giúp bạn với điều đó. –

+0

Bạn đang tìm loại hiệu quả nào? tức là Bạn đang quan tâm đến việc sử dụng tối thiểu bộ nhớ, cpu hoặc mạng? – Andy

+0

Với quyền hạn là tôi không thể sử dụng HTML Agility PAck – CapsLock

Trả lời

6

Vâng, cá nhân tôi sẽ sử dụng:

string line; 

while ((line = reader.ReadLine()) != null) 
{ 
    if (line.Contains(...)) 
    { 
    } 
} 

Đọc dòng cung cấp cho bạn dữ liệu cho bạn biết liệu bạn có đến cuối luồng không. Tôi đồng ý với Jeff mặc dù - "phân tích cú pháp" HTML bằng cách đọc nó từng dòng thường là một ý tưởng tồi. Tất nhiên, có thể là là đủ tốt trong hoàn cảnh cụ thể của bạn.

+0

Cuộc gọi của Jon một lần nữa !! ;) –

+0

@Jon: cá nhân tôi nghĩ rằng đó là thiết kế xấu nhưng đó là những gì được và tôi không thể thay đổi thiết kế hiện tại .. – CapsLock

+0

@Mitch: Trong khi điều đó xảy ra là đúng, đó không phải là lý do tại sao tôi đã thức khuya đêm qua - mất ngủ thay vì: ( –

0

Điều này thực sự phụ thuộc - bạn có cần biết DOM nằm ở đâu trong văn bản cụ thể của bạn không? Đầu vào lớn bao nhiêu? Chuỗi của bạn có bao giờ được tách ra giữa hai dòng không?

Nếu bạn chỉ quan tâm đến sự hiện diện của văn bản và đầu vào của bạn đủ nhỏ để nằm trong bộ nhớ, tôi chỉ đọc toàn bộ nội dung trong bộ nhớ. Tôi không chắc thuật toán CLR chính xác sử dụng để thực hiện so khớp chuỗi, nhưng một số quy trình nhanh hơn liên quan đến xử lý trước cả truy vấn và chuỗi cần tìm kiếm và có thêm thông tin cho quá trình xử lý trước có khả năng mang lại tìm kiếm nhanh hơn.

Tất nhiên, tất cả điều này phụ thuộc vào nội bộ CLR và các yêu cầu cụ thể của bạn - kiểm tra, kiểm tra, kiểm tra.

Nếu bạn muốn nắm bắt thêm thông tin về văn bản và mối quan hệ của nó với tài liệu xung quanh, tôi khuyên bạn nên xem thư viện HtmlAgility để phân tích cú pháp tài liệu của bạn.

1

Dưới đây là làm thế nào để làm điều đó với regex, chắc chắn regex không phải là phương pháp tốt nhất, nhưng nếu điều này là một điều một thời gian làm việc với một phân tích cú pháp html có lẽ là nhiều hơn bạn đang thương lượng cho

Match myMatch = Regex.Match(input, 
     @"<div class=""box-round"">.*?<li>(.*?)</ol>", Regex.Singleline); 

if (myMatch.Success) 
{ 

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