0

res/rawフォルダーにcities.txtファイルを配置しました。その中には次のものが含まれています。

<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に表示したいと思います。出力は次のようになります。

オーバーン

バーミンガム

私の現在のコードは、6つの都市すべてを取得し、代わりにそれらを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にはより多くの情報が含まれています、私はサンプルのみを提供しました。よろしくお願いします。ありがとうございました!

4

2 に答える 2

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.

    }

}
于 2013-01-13T20:28:26.463 に答える
0

これは、HTMLドキュメントの奇妙な構造です。は<div>ヘッダーにのみ使用され、リストはそれ自体でオフになっています。実際のドキュメントをトリミングすると、これが機能する場合と機能しない場合があります。後の要素は、のul次の要素divに含まれているため、次の兄弟に移動してそこで検索する必要があります。divこれは、と要素の間に他の要素がない場合にのみ機能しulます。

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());
        }
}

}

于 2013-01-13T20:58:18.267 に答える