안녕하세요
공공데이터를 보면 파일데이터랑 오픈 api로 나뉘는 걸 볼 수 있습니다.
여러 가지 데이터가 있지만
파일데이터는 csv, 오픈 api는 json이랑 xml이 대부분이라는 것을 알 수가 있습니다.
파일데이터의 json+xml가 있는데 이건 담당자가 csv파일을 올리면 자동으로 json이랑 xml로 변환이 됩니다.
오픈 api에 올려진 데이터들은 따로 공공기관이 용역 업체를 통해 올린 겁니다.
안드로이드 공공데이터 json변환을 하고 싶으면 아래에 포스팅을 참고해 주세요
https://ruminz.tistory.com/147
공공데이터의 회원가입을 완료 후 로그인을 해주세요
저는 근로복지공단_질병판정서 조회 서비스 데이터를 가지고 파싱을 해보겠습니다.
해당 데이터를 활용신청한 다음 마이페이지에서 누르면 일반 인증키(Encoding) 부분이 보입니다. 해당 인증키를 복사해 주세요
그런 다음 밑에 스크롤해보시면 심의결과 유형 조회라고 있습니다. 해당 부분을 클릭하면 밑에 요청변수가 나타납니다.
항목명 servicekey 옆에 아까 복사한 인증키를 붙여 넣기 해주세요 그런 다음 미리 보기를 눌러주세요
미리보기를 누르면 xml 웹페이지가 나타납니다. 그러면 활용신청이 완료된 거고 파싱 할 준비가 완료된 겁니다.
이제 안드로이드 스튜디오로 넘어갑시다
volley를 쓰기 위해서는 AndroidManifest.xml에서
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
이걸 입력해 줘야 됩니다.
그리고 <application> 태그 안에
그런 다음 build.gradle 파일에 들어가서
build.gradle(Module:app) 파일에 들어가서
dependencies 부분에
implementation('org.simpleframework:simple-xml:2.7.+'){
exclude module: 'stax'
exclude module: 'stax-api'
exclude module: 'xpp3'
}
implementation 'com.android.volley:volley-cronet:1.2.1'
를 입력해 주세요
마지막으로 Sync Now를 클릭해 주세요
이제 아까 미리 보기 해서 나온 xml 웹페이지에 있는 xml 코드를 전부 복사해 줍니다.
그리고 아래의 사이트를 들어가 주세요
https://json2csharp.com/code-converters/xml-to-java
xml코드를 파싱 하기 위해 모델 클래스를 자동으로 만들어주는 사이트입니다.
xml부분에 아까 xml 웹페이지에서 복사한 xml 코드를 붙여 넣기 해줍니다. 그리고 convert버튼을 클릭하면
오른쪽에 java 모델클래스 코드가 나옵니다. 그리고 zip as file버튼을 눌러줍니다.
zip as file 버튼을 누르면 zip파일이 다운로드됩니다. 그 다운로드된 파일의 압축을 풀어주고 안에 있는 java파일을 전부 복사해서 안드로이드 스튜디오에 붙여 넣기 해줍시다.
이제 xml코드를 파싱을 하고 표시를 해야 되니 간단하게 TextView를 activity_main.xml파일에 추가해 줍시다.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/xml_code"/>
</LinearLayout>
파싱 된 데이터를 표시하기 위해 TextView를 하나 넣어주었습니다.
저는 저 xml 데이터의 kinda부분을 가져오겠습니다.
그전에 모델클래스를 수정해야 됩니다. 모델클래스란 아까 사이트에서 파싱 한 java파일들을 말합니다.
body
package com.grandera.tistory;
import androidx.recyclerview.widget.RecyclerView;
import org.simpleframework.xml.Element;
@Element(name = "body")
public class body {
public items getitems() {
return this.items; }
public void setitems(items items) {
this.items = items; }
@Element
items items;
public int getnumOfRows() {
return this.numOfRows; }
public void setnumOfRows(int numOfRows) {
this.numOfRows = numOfRows; }
@Element
int numOfRows;
public int getpageNo() {
return this.pageNo; }
public void setpageNo(int pageNo) {
this.pageNo = pageNo; }
@Element
int pageNo;
public int gettotalCount() {
return this.totalCount; }
public void settotalCount(int totalCount) {
this.totalCount = totalCount; }
@Element
int totalCount;
}
위와 같이 xml을 파싱 하기 위해서는 어노테이션 @Element을 붙여줘야 됩니다.
header
package com.grandera.tistory;
import org.simpleframework.xml.Element;
@Element(name = "header")
public class header {
public int getresultCode() {
return this.resultCode; }
public void setresultCode(int resultCode) {
this.resultCode = resultCode; }
@Element
int resultCode;
public String getresultMsg() {
return this.resultMsg; }
public void setresultMsg(String resultMsg) {
this.resultMsg = resultMsg; }
@Element
String resultMsg;
}
items
package com.grandera.tistory;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import java.util.List;
public class items {
public List<item> getitem() {
return this.item; }
public void setitem(List<item> item) {
this.item = item; }
@ElementList(entry = "item",inline = true)
List<item> item;
}
item
package com.grandera.tistory;
import org.simpleframework.xml.Element;
public class item {
public String getkinda() {
return this.kinda; }
public void setkinda(String kinda) {
this.kinda = kinda; }
@Element
String kinda;
}
그러면 파싱 할 데이터를 가져올 준비가 되었습니다. 이제 데이터를 가져옵시다.
MainActivity
package com.grandera.tistory;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.HttpHeaderParser;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private static RequestQueue requestQueue;
TextView textView;
private String url = "http://apis.data.go.kr/B490001/jilbyeongPstateInfoService/getSimuiResultYuhyeongPstate?serviceKey=본인의인증키&pageNo=1&numOfRows=10";
private response res;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.xml_code);
if(requestQueue == null){
requestQueue = Volley.newRequestQueue(getApplicationContext());
}
Request();
}
private void Request() {
StringRequest request = new StringRequest(
Request.Method.GET,
url,
new Response.Listener<String>() {
@Override
public void onResponse(String Response) {
Log.v("태그", "리스폰" + Response);
Serializer serializer = new Persister();
try {
res = serializer.read(response.class,Response);
}catch (Exception e){
e.printStackTrace();
}
Log.v("태그","값:"+res.getbody().getitems().getitem().get(0).getkinda());
textView.setText(res.getbody().getitems().getitem().get(0).getkinda());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.v("태그", "에러" + error.getMessage());
}
}) {
@Override //response를 UTF8로 변경해주는 소스코드
protected Response<String> parseNetworkResponse(NetworkResponse response) {
try {
String utf8String = new String(response.data, "UTF-8");
return Response.success(utf8String, HttpHeaderParser.parseCacheHeaders(response));
} catch (Exception e) {
// log error
return Response.error(new ParseError(e));
}
}
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> param = new HashMap<String, String>();
return param;
}
};
request.setShouldCache(false);
requestQueue.add(request);
}
}
'Coding > Android' 카테고리의 다른 글
JetPack Compose 구성 요소 (0) | 2023.02.18 |
---|---|
jetpack compose 개요 및 구성 (0) | 2023.02.18 |
안드로이드 aab 파일 프로그램없이 실행시키기 (0) | 2022.09.05 |
안드로이드 네이버 지도 띄우기 (0) | 2022.08.20 |
안드로이드 Volley 공공데이터 가져오기 (4)- 다중 마커 (0) | 2022.06.02 |