2011-08-04 12 views
6

obtengo respuesta web y utilizar StreamReader para obtener la respuesta como una cadenaforma eficiente para encontrar cadena con StreamReader

mi código es

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

muestra de cadena es

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

o

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

Quiero busque la siguiente línea dentro de la cadena

Order ID #A123456 already exists: Update performed 

o

New order created 

Es esta la mejor manera de buscar la línea (s)

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

     } 
    } 
+6

Usted' re analizando HTML? En términos generales, debe utilizar un analizador HTML. [HTML Agility Pack] (http://htmlagilitypack.codeplex.com/) podría ayudarlo con eso. –

+0

¿Qué tipo de eficiencia estás buscando? es decir, ¿a qué recurso le preocupa minimizar el uso de: memoria, CPU o red? – Andy

+0

Con los poderes de ser no puedo usar HTML Agility PAck – CapsLock

Respuesta

6

Bueno, personalmente lo haría uso:

string line; 

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

Reading the line le proporciona los datos y que le informa si ha llegado al final de la transmisión. Sin embargo, estoy de acuerdo con Jeff: "analizar HTML" leyéndolo línea por línea generalmente es una mala idea. Es puede ser lo suficientemente bueno en su situación específica, por supuesto.

+0

¡Jon está de nuevo llamado! ;) –

+0

@Jon: personalmente, creo que es un mal diseño, pero es lo que es y no puedo cambiar el diseño existente ... – CapsLock

+0

@Mitch: Si bien eso es cierto, no fue por eso que me levanté anoche - insomnio en su lugar :( –

0

Esto realmente depende: ¿necesita saber en qué lugar del DOM reside su texto en particular? ¿Qué tan grande es la entrada? ¿Su cadena se dividirá alguna vez entre dos líneas?

Si solo le preocupa la presencia del texto y su entrada es lo suficientemente pequeña para residir en la memoria, acabo de leer todo en la memoria. No estoy seguro de cuál es el algoritmo exacto que utiliza CLR para hacer la coincidencia de cadenas, pero algunas de las rutinas más rápidas implican preprocesar tanto la consulta como la cadena que se buscará, y tener más información para el preprocesamiento podría generar una búsqueda más rápida.

Por supuesto, todo esto depende de los requisitos internos de CLR y de sus requisitos particulares: prueba, prueba y prueba.

Si desea capturar más información sobre su texto y su relación con el documento circundante, le sugiero que consulte la biblioteca HtmlAgility para analizar su documento.

1

Así es como hacerlo con expresiones regulares, seguro de expresión regular no es el mejor método, pero si esto es una cosa de tiempo de trabajo con un analizador de HTML es probablemente más de lo que son las negociaciones para

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

if (myMatch.Success) 
{ 

} 
Cuestiones relacionadas