1. 공공기관 데이터 포털(https://www.data.go.kr/) 접속 후 원하는 개발 계정을 신청합니다.
저는 URL 요청하여 xml을 파싱 할 것이므로 일반 유형과 앱 개발로 신청했습니다.
2. 승인 완료 후 발급 받은 인증키를 이용하여 데이터 조회가 가능합니다.
참고문서의 필수 요청 변수 확인 후 url+인증키+요청 변수를 적어 데이터 조회가 가능합니다.
예) http://openapi.kepco.co.kr/service/evInfoService/getEvSearchList?pageNo=1&numOfRows=10&ServiceKey="서비스키"
3. 올바른 url을 요청 했을 경우 다음과 같이 데이터 조회가 원활하게 이루어집니다.
참고문서를 확인하여 필수 변수 항목을 ★반드시★ 체크 하셔야 해요.
url 때문에 제가 며칠동안 삽질했더염.데헷
4. 안드로이드에 파싱하기
1) MainActivity.java
단순히 파싱+검색 기능만을 위한 소스만 있어요. 정말 쉬운 코드라서 주석과 함께 보시면 이해하기는 어렵지 않을거에요!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195 |
package 패키지명;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;
public class MainActivity extends Activity {
EditText edit;
TextView text;
String key="발급 받은 인증키";
String data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit= (EditText)findViewById(R.id.edit);
text= (TextView)findViewById(R.id.text);
}
//Button을 클릭했을 때 자동으로 호출되는 callback method
public void mOnClick(View v){
switch( v.getId() ){
case R.id.button:
// 급하게 짜느라 소스가 지저분해요..
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
data= getXmlData();//아래 메소드를 호출하여 XML data를 파싱해서 String 객체로 얻어오기
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
text.setText(data); //TextView에 문자열 data 출력
}
});
}
}).start();
break;
}
}
String getXmlData(){
StringBuffer buffer=new StringBuffer();
String str= edit.getText().toString();//EditText에 작성된 Text얻어오기
String location = URLEncoder.encode(str);//한글의 경우 인식이 안되기에 utf-8 방식으로 encoding //지역 검색 위한 변수
String queryUrl="http://openapi.kepco.co.kr/service/evInfoService/getEvSearchList?"//요청 URL
+"addr="+location
+"&pageNo=1&numOfRows=1000&ServiceKey=" + key;
try {
URL url= new URL(queryUrl);//문자열로 된 요청 url을 URL 객체로 생성.
InputStream is= url.openStream(); //url위치로 입력스트림 연결
XmlPullParserFactory factory= XmlPullParserFactory.newInstance();
XmlPullParser xpp= factory.newPullParser();
xpp.setInput( new InputStreamReader(is, "UTF-8") ); //inputstream 으로부터 xml 입력받기
String tag;
xpp.next();
int eventType= xpp.getEventType();
while( eventType != XmlPullParser.END_DOCUMENT ){
switch( eventType ){
case XmlPullParser.START_DOCUMENT:
buffer.append("파싱 시작...\n\n");
break;
case XmlPullParser.START_TAG:
tag= xpp.getName();//태그 이름 얻어오기
if(tag.equals("item")) ;// 첫번째 검색결과
else if(tag.equals("addr")){
buffer.append("주소 : ");
xpp.next();
buffer.append(xpp.getText());//addr 요소의 TEXT 읽어와서 문자열버퍼에 추가
buffer.append("\n"); //줄바꿈 문자 추가
}
else if(tag.equals("chargeTp")){
buffer.append("충전소타입 : ");
xpp.next();
buffer.append(xpp.getText());
buffer.append("\n");
}
else if(tag.equals("cpId")){
buffer.append("충전소ID :");
xpp.next();
buffer.append(xpp.getText());//cpId
buffer.append("\n");
}
else if(tag.equals("cpNm")){
buffer.append("충전기 명칭 :");
xpp.next();
buffer.append(xpp.getText());//cpNm
buffer.append("\n");
}
else if(tag.equals("cpStat")){
buffer.append("충전기 상태 코드 :");
xpp.next();
buffer.append(xpp.getText());//
buffer.append("\n");
}
else if(tag.equals("cpTp")){
buffer.append("충전 방식 :");
xpp.next();
buffer.append(xpp.getText());//
buffer.append(" , ");
}
else if(tag.equals("csId")){
buffer.append("충전소 ID :");
xpp.next();
buffer.append(xpp.getText());//csId
buffer.append("\n");
}
else if(tag.equals("cpNm")){
buffer.append("충전소 명칭 :");
xpp.next();
buffer.append(xpp.getText());
buffer.append("\n");
}
else if(tag.equals("lat")){
buffer.append("위도 :");
xpp.next();
buffer.append(xpp.getText());//
buffer.append("\n");
}
else if(tag.equals("longi")){
buffer.append("경도 :");
xpp.next();
buffer.append(xpp.getText());//
buffer.append("\n");
}
else if(tag.equals("statUpdateDatetime")){
buffer.append("충전기상태갱신시각 :");
xpp.next();
buffer.append(xpp.getText());//
buffer.append("\n");
}
break;
case XmlPullParser.TEXT:
break;
case XmlPullParser.END_TAG:
tag= xpp.getName(); //태그 이름 얻어오기
if(tag.equals("item")) buffer.append("\n");// 첫번째 검색결과종료..줄바꿈
break;
}
eventType= xpp.next();
}
} catch (Exception e) {
// TODO Auto-generated catch blocke.printStackTrace();
}
buffer.append("파싱 끝\n");
return buffer.toString();//StringBuffer 문자열 객체 반환
}
} |
cs |
2) activity_main.xml
정말 간단하게 파싱만 할 화면이라 단순합니다.
cs
3) AndroidManifest.xml
웹에서 데이터를 요청받아 조회해야 하기 때문에 인터넷 권한 설정을 위해 반드시 추가해야 합니다!
1 |
<uses-permission android:name="android.permission.INTERNET"/> |
cs |
4) 결과 화면
시, 구 두가지로 검색 해보았어요. 아주 잘 나옵니당!
지오코딩으로 위도와 경도를 지도에 뿌리는 것은 다음 시간에!
url 쪽에서 저처럼 삽질 하지 마시고 주의를 기울여서 한번에 빡 성공하세욤!..ㅠ.ㅠ