본문 바로가기
개발/안드로이드

[안드로이드] 공공데이터 api 파싱 예시 및 그래프 표현

by 핸디(Handy) 2019. 8. 15.

[사이트]

공공데이터 포탈에 들어가서 api 이용신청을 한 다음 마이페이지에 가보게 되면 이 화면이 나오게 됩니다.

여기서 api 키값을 확인합니다.

사진과 같이 실행->미리보기를 누르면 예시로 요청된 데이터를 확인할 수 있습니다.
이런식으로 나오네요. xml형식!

 

[전체 구조]

[manifest]

<uses-permission android:name="android.permission.INTERNET" />

    api를 사용하기 위해서 manifest 안에 인터넷 연결옵션을 넣습니다.

 

[java]

xml파싱은 while를 순회하는 방식으로 작동합니다.

<START_TAG>TEXT<END_TAG> 로 이루어져 있습니다.

parser가 데이터를 받아오면서 START_TAG를 만나면 해당하는 boolean 함수를 true하고 다음데이터를 받을때 해당하는 TEXT를 받아와 읽어오는 방식입니다.

package com.example.social_sns;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;

import com.github.mikephil.charting.animation.Easing;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private LineChart lineChart;
    static List<Entry> entries = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lineChart = (LineChart)findViewById(R.id.chart);

        //공공데이터 전기 판매량 api 불러오기
        PowersellApi powersellApi = new PowersellApi();
        powersellApi.execute("", "", "");

        //딜레이는 공공데이터 api의 응답속도가 10초~15초 사이이기에 20초의 딜레이를 주고 그래프로 표현
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
              
                entries.add(new Entry(1, 1));
                LineDataSet lineDataSet = new LineDataSet(entries, "속성명1");
                lineDataSet.setLineWidth(2);
                lineDataSet.setCircleRadius(6);
                lineDataSet.setCircleColor(Color.parseColor("#FFA1B4DC"));
                lineDataSet.setCircleColorHole(Color.BLUE);
                lineDataSet.setColor(Color.parseColor("#FFA1B4DC"));
                lineDataSet.setDrawCircleHole(true);
                lineDataSet.setDrawCircles(true);
                lineDataSet.setDrawHorizontalHighlightIndicator(false);
                lineDataSet.setDrawHighlightIndicators(false);
                lineDataSet.setDrawValues(false);
                LineData lineData = new LineData(lineDataSet);
                lineChart.setData(lineData);
                XAxis xAxis = lineChart.getXAxis();
                xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
                xAxis.setTextColor(Color.BLACK);
                xAxis.enableGridDashedLine(8, 24, 0);
                YAxis yLAxis = lineChart.getAxisLeft();
                yLAxis.setTextColor(Color.BLACK);
                YAxis yRAxis = lineChart.getAxisRight();
                yRAxis.setDrawLabels(false);
                yRAxis.setDrawAxisLine(false);
                yRAxis.setDrawGridLines(false);
                Description description = new Description();
                description.setText("");
                lineChart.setDoubleTapToZoomEnabled(false);
                lineChart.setDrawGridBackground(false);
                lineChart.setDescription(description);
                lineChart.animateY(2000, Easing.EasingOption.EaseInCubic);
                lineChart.invalidate();
            }
        }, 20000);



    }


    public class PowersellApi extends AsyncTask<String, String, String> {

        @Override
        protected String doInBackground(String... strings) {
            Log.d("findpath_start", "start");


            //포털에서 받은 apikey값을 아래에 넣고
            String Apikey = "여러분의 키값~!~!";
            
            //요청 파라미터에 값을 넣습니다.
            String startDate="201202";
            String endDate="201205";

            //요청할 url를 만들고
            String requestUrl = "https://www.kdhc.co.kr/openapi-data/service/kdhcPowerSell/powerSell?serviceKey="+Apikey+"&pageNo=1&numOfRows=10&startDate="+startDate+"&endDate="+endDate;

            Log.d("findpath_distance",requestUrl);

            //try를 통해 요청을 시작합니다.
            try {
                boolean b_item = false;
                boolean b_branchId = false;
                boolean b_branchName=false;
                boolean b_pwrQty=false;
                boolean b_pwrQtyUnit=false;
                boolean b_rnum=false;
                boolean b_yyyymm=false;


                URL url = new URL(requestUrl);
                InputStream is = url.openStream();
                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                XmlPullParser parser = factory.newPullParser();
                parser.setInput(new InputStreamReader(is, "UTF-8"));

                String tag;
                String temp_item = "";
                String temp_branchId = "";
                String temp_branchName = "";
                String temp_pwrQty = "";
                String temp_pwrQtyUnit = "";
                String temp_rnum = "";
                String temp_yyyymm = "";
                int countlist=0;

                int eventType = parser.getEventType();

                while (eventType != XmlPullParser.END_DOCUMENT) {
                    //Log.d("findpath_parser", String.valueOf(eventType)+" name : "+parser.getName()+" text : "+parser.getText());
                    switch (eventType) {
                        case XmlPullParser.START_DOCUMENT:
                            break;

                        case XmlPullParser.START_TAG: {
                            if (parser.getName().equals("item")) {
                                b_item=true;
                                Log.d("findpath--------", "--------");
                            }
                            if (parser.getName().equals("branchId")) {
                                b_branchId = true;
                            }
                            if (parser.getName().equals("branchName")) {
                                b_branchName = true;
                            }
                            if (parser.getName().equals("pwrQty")) {
                                b_pwrQty = true;
                            }
                            if (parser.getName().equals("pwrQtyUnit")) {
                                b_pwrQtyUnit = true;
                            }
                            if (parser.getName().equals("rnum")) {
                                b_rnum = true;
                            }
                            if (parser.getName().equals("yyyymm")) {
                                b_yyyymm = true;
                            }
                            break;
                        }

                        case XmlPullParser.TEXT: {
                            if(b_item){
                                b_item=false;
                            }

                            if ( b_branchId) {
                                temp_branchId = parser.getText();
                                Log.d("temp_branchId",temp_branchId);
                                b_branchId = false;
                            }
                            if (b_pwrQty) {
                                temp_pwrQty = parser.getText();
                                Log.d("temp22", temp_pwrQty);
                                b_pwrQty = false;
                            }
                            if (b_branchName) {
                                temp_branchName = parser.getText();
                                Log.d("temp_branchName", temp_branchName);
                                b_branchName = false;
                            }
                            if (b_pwrQtyUnit) {
                                temp_pwrQtyUnit = parser.getText();
                                Log.d(" temp_pwrQtyUnit", temp_pwrQtyUnit);
                                b_pwrQtyUnit = false;
                            }
                            if ( b_rnum) {
                                temp_rnum = parser.getText();
                                Log.d("temp_rnum", temp_rnum);
                                b_rnum = false;
                            }
                            if (b_yyyymm) {
                                temp_yyyymm = parser.getText();
                                Log.d("temp_yyyymm", temp_yyyymm);
                                //여기서 그래프에 값을 넣습니다.
                                entries.add(new Entry(countlist, Float.parseFloat(temp_pwrQty)));
                                countlist++;
                                b_yyyymm = false;
                            }

                            break;
                        }
                        case XmlPullParser.END_TAG:
                            if (parser.getName().equals("item")) {

                                break;
                            }

                        case XmlPullParser.END_DOCUMENT:
                            break;


                    }
                    eventType = parser.next();
                }
            } catch (Exception e) {
                e.printStackTrace();
                Log.e("HomeFra_transportapi_", "Error: " + e.getMessage());
            }

            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

        }

    }

}

 

[결과]

추가적으로 그래프를 이용하려면 추가적인 디펜던시가 필요합니다.

댓글