2011-08-04 8 views
6

uzyskać odpowiedź internetową i użyć StreamReader uzyskanie odpowiedzi jako ciągskutecznym sposobem na znalezienie ciąg z StreamReader

mój kod jest

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

przykładowy ciąg jest

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

lub

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

Chcę znaleźć następującą linię w obrębie łańcucha

Order ID #A123456 already exists: Update performed 

lub

New order created 

Jest to najlepszy sposób, aby szukać linii (ów)

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

     } 
    } 
+6

ty” ponownie przeanalizować HTML? Ogólnie rzecz biorąc, powinieneś używać parsera HTML. [HTML Agility Pack] (http://htmlagilitypack.codeplex.com/) może ci w tym pomóc. –

+0

Jakiego rodzaju wydajności szukasz? tj. który zasób jest zaniepokojony minimalizacją użycia: pamięci, procesora lub sieci? – Andy

+0

Z uprawnieniami bycia nie mogę używać HTML Agility PAck – CapsLock

Odpowiedz

6

Cóż, osobiście chciałbym użyj:

string line; 

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

Czytanie linii daje dane i mówi, czy osiągnąłeś koniec strumienia. Zgadzam się jednak z Jeffem - "parsowanie" HTML przez czytanie linii po linii jest generalnie złym pomysłem. Oczywiście, w twojej konkretnej sytuacji może być wystarczająco dobrze.

+0

Jon jest na wezwanie ponownie !! ;) –

+0

@Jon: Osobiście uważam, że to kiepski projekt, ale to, co jest i nie mogę zmienić istniejącego projektu .. – CapsLock

+0

@Mitch: Chociaż tak się dzieje, to nie dlatego wczoraj wstałem późno - zamiast tego bezsenność :( –

0

To naprawdę zależy - czy musisz wiedzieć, gdzie w DOM znajduje się twój konkretny tekst? Jak duże jest wejście? Czy twój ciąg będzie kiedykolwiek podzielony między dwie linie?

Jeśli martwisz się jedynie obecnością tekstu, a twoje dane wejściowe są na tyle małe, że mieszczą się w pamięci, po prostu przeczytałbym całą rzecz w pamięci. Nie jestem pewien, jaki dokładny algorytm używa CLR do dopasowywania ciągów znaków, ale niektóre z szybszych procedur obejmują wstępne przetwarzanie zarówno zapytania, jak i szukanego ciągu, a posiadanie większej ilości informacji do wstępnego przetwarzania może potencjalnie spowodować szybsze wyszukiwanie.

Oczywiście wszystko zależy od wewnętrznych elementów CLR i konkretnych wymagań użytkownika - testu, testu, testu.

Jeśli chcesz zdobyć więcej informacji o tekście i jego związku z otaczającym dokumentem, proponuję przejrzeć bibliotekę HtmlAgility w celu przeanalizowania dokumentu.

1

Oto jak zrobić to z regex, pewien regex nie jest najlepsza metoda, ale jeśli jest to rzecz jedna godzina pracy z parsera HTML jest prawdopodobnie więcej niż jesteś przetargową dla

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

if (myMatch.Success) 
{ 

} 
Powiązane problemy