JSoup将元素解析为空

时间:2016-01-02 21:05:36

标签: android android-asynctask jsoup

我试图使用JSoup解析一些数据,这一切都发生在我的MainActivity的asynctask(doInBackground)部分。 不幸的是,当我执行应用程序时,所有元素(9)都是空的。

当我在代码行下面调试时,我实际上得到了完整网站,它就在那里。 方法 readMultipleLinesRespone()位于另一个类 HttpUtility 中,我也调用了Post和Get请求。

我通过将网站保存为文件并使用JSoups 资产功能来预先测试此功能,然后它完美运行。

onPostExecute 中的 setupAdapter()方法使用数据填充ExpandableListview,如果此信息为nessecary。如果您需要更多信息,请询问。

有人可以协助并告诉我我做错了吗?

  

response1 = util.readMultipleLinesRespone(); < ---已调试,所有数据(似乎)都在那里,但不是。

修改:如果我打印response1,确实要解析数据。 Logcat输出:

  

E / Resonse :: [Ljava.lang.String; @ 3d3410a

以下是来自HttpUtility类的方法readMultipleLinesRespone:

public String[] readMultipleLinesRespone() throws IOException {
    InputStream inputStream = null;
    if (httpConn != null) {
        inputStream = httpConn.getInputStream();
    } else {
        throw new IOException("Connection is not established.");
    }

    BufferedReader reader = new BufferedReader(new InputStreamReader(
            inputStream));
    List<String> response = new ArrayList<String>();

    String line = "";
    while ((line = reader.readLine()) != null) {
        response.add(line);
    }
    reader.close();

    return (String[]) response.toArray(new String[0]);
}

asynctask,它所有的hapening:

private class FetchWebsiteData extends AsyncTask<Void, Void, Void> {
    ProgressDialog mProgressDialog;

    @Override
    protected void onPreExecute() {
        this.mProgressDialog = new ProgressDialog(getActivity());
        mProgressDialog.setMessage("Laden...");
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... result) {

        try {
            util.sendGetRequest("https://mobile.somesite.nl/Data", null);
            response1 = util.readMultipleLinesRespone();
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (response1.length > 0) {
            Document doc = Jsoup.parse(response1.toString());

            // Get the html document title
            Elements els = doc.select("span[class=item-value pull-right]");

                if (els.size() > 0) {
                    fac_naam = els.get(0).text();
                    fac_straat = els.get(1).text();
                    fac_post = els.get(2).text();
                    con_tel = els.get(3).text();
                    con_email = els.get(4).text();
                    betaal_reknr = els.get(5).text();
                    betaal_houd = els.get(6).text();
                    zig_gebruiker = els.get(7).text();
                    zig_wacht = els.get(8).text();
                }
        }
        return null;
        }

    @Override
    protected void onPostExecute(Void result) {
        super.onPreExecute();
        setupAdapter();
        mProgressDialog.dismiss();
    }
}

1 个答案:

答案 0 :(得分:1)

与此同时,我解决了这个问题。 我没有正确地将响应字符串传递给解析所需元素的asynctask。 只需要一个公共字符串,其中设置和传递响应(不是一种优雅的方式,但它可以工作):

public static String HttpResponse = "";

在HttpUtility类中:

public String[] readMultipleLinesRespone() throws IOException {
        ...

        TabFragment1.HttpResponse = response.toString();
     ...
        return (String[]) response.toArray(new String[0]);
    }

然后将其传递给asynctask:

@Override
        protected Void doInBackground(Void... result) {

            try {
                util.sendGetRequest(LoginActivity.PersData_URL, null);

                util.readMultipleLinesRespone();

            } catch (IOException e) {
                e.printStackTrace();
            }

            if (HttpResponse.length() > 0) {
                Document doc = Jsoup.parse(HttpResponse.toString());
                // Get the html document title
                Elements els = doc.select("span[class=item-value pull-right]");
              ...

            }
            return null;
        }