2012-03-29 7 views
0

私はHTMlを解析するために私のコードを使用しています.2番目のコードは単純リストの配列に値を設定する方法です。データを解析して配列を取り込む方法

私が持っている問題は、あまりにも長いデータをダウンロードし、解析して表示するには5〜6秒かかることです。

その明確な私はハード渡されます一度行われたコードの2ビット目にURLを、コード化されたばかりので、また

できるだけそうインスタントその限り近づけてプロセスをスピードアップするための方法は何ですかあなたが使用するルートと方向に応じて、停止します。

public ArrayList<String> getStops(String URL) { 
    ArrayList<String> BusStop = new ArrayList<String>(); 
    String HTML = DownloadText(URL); 
    String temp = null; 
    String temp2[] = new String[40]; 
    Pattern p = Pattern.compile("<a class=\"ada\".*</a>", Pattern.DOTALL); 

    Matcher m = p.matcher(HTML); 
    while (m.find()) { 
     temp = m.group(); 
     temp2 = temp.split("<br></td>"); 
    } 

    for (int i = 0; i < temp2.length; i++) { 
     temp = temp2[i]; 
     temp = temp.replaceAll("<a class=\"ada\" title=\"", ""); 
     temp = temp.replaceAll("\".*\"", ""); 
     temp = temp.replaceAll("\n", ""); 
     temp = temp.replaceAll("\t", ""); 
     temp = temp.replaceAll(",</a>", ""); 
     temp = temp.replaceAll("</tr>.*>", ""); 
     temp = temp.replaceAll("<td.*>", ""); 
     temp = temp.replaceAll(">.*", ""); 
     BusStop.add(temp); 
    } 

    return BusStop; 
} 

..

TransitXMLExtractor extractor; 
static String baseURL5 = "http://www.ltconline.ca/webwatch/ada.aspx?r=1&d=2"; 

/** Populates string array with bus routes */ 
public String[] busStopArray() { 
    extractor = new TransitXMLExtractor(); 
    String[] busStopArray = new String[31]; 

    for (int n = 0; n < busStopArray.length; n++) { 
     busStopArray[n] = extractor.getStops(baseURL5).get(n); 
    } 
    return busStopArray; 

} 
+0

まず、私は最も時間のかかる手順を見つけようとします。これは単純にネットワーキングのステップになる可能性があり、この場合、スピードアップはほとんど不可能です。 –

+1

別の考え方 - サーバーがJSONまたはXML(現在のHTMLと比較して)でデータを返すようにサーバーを制御する場合、デバイス側ではデータをより高速に解析することができます。 –

+0

トランジットアプリケーションを作成する予定の場合、iRailチームに連絡することをお勧めします。http://project.irail.be/彼らは、輸送会社、サーバー、NPOなどのデータを掻き集めるツールがたくさんあります、すべてがopensourceです! –

答えて

0

あなたが正規表現であなたが望む正確なテキストを引っ張り、構文解析ループを減らすことによって、物事をスピードアップすることができように思えます。

public ArrayList<String> getStops(String URL) { 
    ArrayList<String> BusStop = new ArrayList<String>(); 
    String HTML = DownloadText(URL); 
    Pattern p = Pattern.compile("<a class=\"ada\" title=\"([\\w\\s]+)\""); 

    Matcher m = p.matcher(HTML); 
    while (m.find()) { 
     BusStop.add(m.group(1)); 
    } 

    return BusStop; 
} 

また、呼び出し元のビットは、単に次のようになります。

public String[] busStopArray() { 
    extractor = new TransitXMLExtractor(); 

    return extractor.getStops(baseURL5).toArray(new String[0]); 
} 

私は今それを持っている方法、それはクラスのADA」の各リンクからtitle属性のテキストを引く必要があります。

編集:明確にするには、実際に<a class="ada" title="(whatever)"を1つずつgroup(1)のテキストを取得して(whatever)というテキストを取得する必要があります。

EDIT 2:私は作業コードであることがわかった例を更新しました。また、ここでは私がテストに使用したアクティビティ全体を以下に示します。

package com.kiswa.test; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 

public class TestActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     StringBuilder sb = new StringBuilder(); 
     for (String stop : busStopArray()) { 
      sb.append(stop); 
     } 
     Log.d("STRING_TEST", sb.toString()); 

     setContentView(R.layout.main); 
    } 

    public String DownloadText() throws UnsupportedEncodingException, IOException { 
     Log.d("STRING_TEST", "In DownloadText"); 
     URL url = new URL("http://www.ltconline.ca/webwatch/ada.aspx?r=1&d=2"); 
     BufferedReader reader = null; 
     StringBuilder builder = new StringBuilder(); 
     try { 
      reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); 
      for (String line; (line = reader.readLine()) != null;) { 
       builder.append(line.trim()); 
      } 
     } finally { 
      if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} 
     } 

     return builder.toString(); 
    } 

    public ArrayList<String> getStops() { 
     Log.d("STRING_TEST", "In getStops"); 
     ArrayList<String> BusStop = new ArrayList<String>(); 
     String HTML = ""; 
     try { 
      HTML = DownloadText(); 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Pattern p = Pattern.compile("<a class=\"ada\" title=\"([\\w\\s]+)\""); 

     Matcher m = p.matcher(HTML); 
     while (m.find()) { 
      BusStop.add(m.group(1)); 
     } 

     return BusStop; 
    } 

    public String[] busStopArray() { 
     Log.d("STRING_TEST", "In busStopArray"); 
     return getStops().toArray(new String[0]); 
    } 
} 
+0

私は呼び出しビットを試しました、あなたは提案したが、動作しません。正規表現だけでなく、間違っている、それは私の頭をそれの周りに得ることができます、私はいくつかのつまんで、病気が必要です。 –

+0

テスト済みの作業設定で答えを更新しました。正規表現はより多くのエスケープを必要とし、 'toArray'呼び出しは' String [] 'にタイプする必要がありました – kiswa

+0

ところで、私のサンプルアクティビティの実行時間は約0.5秒です。 – kiswa

関連する問題