読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

AndroidにおけるXML、jsonパース処理

Android Java

概要

tiro105.hateblo.jp
とかで取得したxmlデータを、AndroidXMLパース処理する方法をまとめる

詳細

xmlパース処理

現在のnodeを確認して、xmlを解析していく

public class HttpTestGet extends AsyncTask<Void, Void, String> {
    TextView textView;
    private static final String BR = System.getProperty("line.separator");

    public HttpTestGet(TextView text) {
        textView = text;
    }

    @Override
    protected String doInBackground(Void... param) {
        try {
            URL url = new URL("http://www.wings.msn.to/tmp/book.xml");
            URLConnection connection = url.openConnection();

            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));

            StringBuilder sb = new StringBuilder();

            // xmlparse
            XmlPullParser parser = Xml.newPullParser();
            parser.setInput(in);
            // 現在のnodeの種類を取得
            int type = parser.getEventType();
            // ドキュメントの最後まで読み込み
            while(type != XmlPullParser.END_DOCUMENT) {
                // 開始タグ
                if(type == XmlPullParser.START_TAG) {
                    String name = parser.getName();
                    // book要素であれば属性リストを、それ以外であれば配下のテキストを出力
                    if(name.equals("book")) {
                        for(int i=0; i < parser.getAttributeCount(); i++) {
                            sb.append(parser.getAttributeName(i) + ":" + parser.getAttributeValue(i) + BR);
                        }
                    }else {
                        type = parser.next();
                        if(type == XmlPullParser.TEXT) {
                            sb.append(name + ":" + parser.getText() + BR);
                        }
                    }
                }
                // END_TAG読み飛ばし
                type = parser.next();
            }

            return sb.toString();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }

        return "";
    }

    @Override
    protected void onPostExecute(String result) {
        textView.setText(result);
    }

}

システムに適切な改行コードを取得する

private static final String BR = System.getProperty("line.separator");

json解析

xml解析と違い、json文字列からJSONObjectを作成する

public class HttpTestGet extends AsyncTask<Void, Void, String> {
    TextView textView;
    private static final String BR = System.getProperty("line.separator");

    public HttpTestGet(TextView text) {
        textView = text;
    }

    @Override
    protected String doInBackground(Void... param) {
        try {
            URL url = new URL("http://www.wings.msn.to/tmp/books.json");
            URLConnection connection = url.openConnection();

            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));

            StringBuilder sb = new StringBuilder();
            StringBuilder result = new StringBuilder();

            String line;

            while ((line = in.readLine()) != null) {
                sb.append(line);
            }

            // 取得した文字列からjsonobjectを作成
            JSONObject jsonObject = new JSONObject(sb.toString());
            // booksキー配下の要素を配列として取得
            JSONArray jsonArray = jsonObject.getJSONArray("books");
            // 配列の内容を順に取得し、titleキーを読み込み
            for(int i=0; i<jsonArray.length(); i++) {
                JSONObject book = jsonArray.getJSONObject(i);
                result.append(book.getString("title") + BR);
            }

            return result.toString();

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

        return "";
    }

    @Override
    protected void onPostExecute(String result) {
        textView.setText(result);
    }

}

参考

Java講座 > 3.8. 改行コード

AndroidエンジニアのためのモダンJava

AndroidエンジニアのためのモダンJava