2011-08-04 30 views
6

は、私は、Web応答を得るのStreamReaderとの文字列を検索し、文字列として応答を得るためには、StreamReaderを使用する効率的な方法が

私のコードがある列の

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

サンプルがある

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

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

私は、文字列

Order ID #A123456 already exists: Update performed 

または

New order created 

以内に次の行を見つけたい、これは個人的に、私は希望、ライン(s)は

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

     } 
    } 
+6

ための交渉よりも多くありますHTMLの解析?一般的に言えば、HTMLパーサを使用する必要があります。 [HTMLアジリティパック](http://htmlagilitypack.codeplex.com/)がそれを手伝ってくれました。 –

+0

あなたはどんなタイプの効率をお探しですか?すなわち、メモリ、CPUまたはネットワークの使用を最小限に抑えることについて懸念しているリソースはどれですか? – Andy

+0

私はHTML Agilityを使うことができませんPAck – CapsLock

答えて

6

まあを検索するための最良の方法です使用:

string line; 

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

は、ストリームの最後に到達したかどうかを示します。私はJeffに同意します - HTMLを "行間で読む"ことによって "解析する"ことは、一般的には悪い考えです。それはもちろん、あなたの特定の状況で十分になるかもしれないかもしれない

+0

Jon's on call again! ;) –

+0

@ジョン:個人的に私はそれが悪いデザインだと思うけど、それは何で、私は既存のデザインを変更することはできません.. – CapsLock

+0

@ミッチ:それは本当であるが、それは私が昨晩遅くなった理由ではなかった - 代わりに不眠症:( –

0

これは本当に依存しています - DOMの特定のテキストがどこにあるのかを知る必要がありますか?入力はどのくらいですか?あなたの弦は2つの線の間で分割されますか?

テキストの存在のみが心配で、入力がメモリに十分に小さい場合は、メモリ全体を読み込むだけです。私はCLRが文字列照合を行うためにどのような正確なアルゴリズムを使用しているのかよく分かりませんが、より速いルーチンの中には検索する文字列と前処理の両方を前処理しています。より速い検索。

もちろん、これはすべてCLR内部構造と特定の要件(テスト、テスト、テスト)によって異なります。

テキストに関する詳細と周囲のドキュメントとの関係をキャプチャしたい場合は、ドキュメントを解析するためのHtmlAgilityライブラリを調べることをおすすめします。ここで

1

は、正規表現でそれを行う方法ですが、「必ず正規表現は、最善の方法ではありませんが、これがあればHTMLパーサでの作業1時間の事は、おそらくあなたはあなたが

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

if (myMatch.Success) 
{ 

}