2013-01-13 54 views
0

我有一個cities.txt文件放置在我的res/raw文件夾中。裏面包含以下內容。使用Jsoup解析特定文本

<div class="state">Alabama</div> 
<ul><li><a href="http://auburn.org">auburn</a></li> 
<li><a href="http://bham.org">birmingham</a></li> </ul> 

<div class="state">Alaska</div> 
<ul><li><a href="http://anchorage.org">anchorage</a></li> 
<li><a href="http://fairbanks.org">fairbanks</a></li></ul> 

<div class="state">Arizona</div> 
<ul><li><a href="http://flagstaff.org">flagstaff</a></li> 
<li><a href="http://mohave.org">mohave county</a></li></ul> 

我想抓住城市爲狀態阿拉巴馬和一個ListView顯示。輸出應該是這樣的。

赤褐色

伯明翰

我當前的代碼抓住所有的六個城市,並顯示在ListView控件來代替。這是我的代碼。

package com.example.readfile; 

import java.io.InputStream; 
import java.util.ArrayList; 
import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 
import android.app.Activity; 
import android.content.res.Resources; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class Cities extends Activity { 

    ListView listUSCities; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.city_layout); 
     listUSCities = (ListView) findViewById(R.id.listcities); 

     new MyTask().execute(); 

    } 

    class MyTask extends AsyncTask<Void, Void, ArrayList<String>> { 

     ArrayList<String> arr_linkText = new ArrayList<String>(); 

     @Override 
     protected ArrayList<String> doInBackground(Void... params) { 

      Document doc; 

      try { 
       Resources res = getResources(); 
       InputStream in_s = res.openRawResource(R.raw.cities); 

       byte[] b = new byte[in_s.available()]; 
       in_s.read(b); 

       // Parsing using Jsoup starts here 
       doc = Jsoup.parse(new String(b)); 

       // Parsing the states 
       Elements links = doc.select("div"); 
       for (Element link : links) { 
        if (link.text().contains("Alabama")) { 

         // Extracting the cities 
         Elements cities = doc.select("a"); 
         for (Element city : cities) { 
          arr_linkText.add(city.text()); 
         } 

        } 

       } 

      } catch (Exception e) { 
       // e.printStackTrace(); 

      } 

      return arr_linkText; // << retrun ArrayList from here 
     } 

     @Override 
     protected void onPostExecute(ArrayList<String> result) { 
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(
        Cities.this, android.R.layout.simple_list_item_1, 
        android.R.id.text1); 
      for (String temp_result : result) { 

       adapter.add(temp_result); 
      } 
      listUSCities.setAdapter(adapter); 
     } 

    } 

} 

我該如何提取城市只爲該特定狀態?

如何在提取城市以優化速度後停止解析文件?

實際的cities.txt包含更多信息,我只提供了一個樣本。我會感謝你的幫助。謝謝!

回答

0

這是一個奇怪的HTML文檔結構。 <div>僅用於標題,列表本身是關閉的。看到你修剪實際的文件時,這可能會或可能不會工作。您之後的元素位於您的div之後的ul元素中,因此您需要轉到下一個兄弟並在那裏搜索。這隻適用於您的divul元素之間沒有其他元素。

Elements links = doc.select("div"); 
for (Element link : links) { 
    if (link.text().contains("Alabama")) { 
     // Extracting the cities in the list that is next in the DOM 
     Elements cities = link.nextElementSibling().select("a"); 
     for (Element city : cities) { 

      arr_linkText.add(city.text()); 
     } 
} 

}

+0

這使它工作。我不得不修剪實際的文檔以使分析速度更快。感謝您的幫助! – Questions

+0

很高興工作。修剪加快處理是一個很好的計劃。我只是想清楚,如果答案是基於樣本的結構! – iagreen

1
// Parsing the states 
       Elements links = doc.select("div"); 
       for (Element link : links) { 
        if (link.text().contains("Alabama")) { 

     // Extracting the cities 
     Elements cities = link.select("a");//<- 'doc' is the whole doc, link is your state. 
     for (Element city : cities) { 
      arr_linkText.add(city.text()); 
     } 
     break;//breaks off the loop, since you have found what you want. 

    } 

} 
+0

它仍然提取所有的城市,我只需要在阿拉巴馬州的城市。我想你回答了我的第二個問題。 – Questions

+0

已更新。看看它。 – wtsang02

+0

這次它沒有提取任何東西。 ListView是空的。 – Questions