본문 바로가기

Android/Seoul OpenAPI 02

Android Seoul OpenAPI example

안드로이드에서 HttpClient, XmlPullParser를 사용하여 서울시 OpenAPI에 접근하고 데이터를 가져오는 예

서울안심먹거리 목록 중에서 50개 항목을 가져와서 XmlPullParser를 거쳐 TextView에 출력하는 내용

참고: '서울안심먹거리 목록' 의 데이터 포맷은 이 페이지 하단을 참고하세요

res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ScrollView android:id="@+id/scrollView1" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="" /> </ScrollView> </LinearLayout>

AndroidManifest.xml 파일 설정 <uses-permission android:name="android.permission.INTERNET"/>

MainActivity.java

package com.example.androidapp; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.impl.client.DefaultHttpClient; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; import android.app.*; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.*; import android.util.*; import android.widget.*; public class MainActivity extends Activity { String auth_code = "개발자 인증 코드"; TextView tv; Handler handler = new Handler(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.textView1); new Thread() { public void run() { connect(); } }.start(); } StringBuilder strBuilder = new StringBuilder(); private void connect() { try{ String service = URLEncoder.encode("서울안심먹거리 목록", "UTF-8"); String strUrl = "http://openapi.seoul.go.kr:8088/xml/"+auth_code+"/"+service+"/1/50/"; HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(strUrl); HttpResponse response = httpClient.execute(httpGet); InputStream is = response.getEntity().getContent(); XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(is, "utf-8"); while(xpp.getEventType()!=XmlPullParser.END_DOCUMENT){ if(xpp.getEventType()==XmlPullParser.START_TAG){ if(xpp.getName().equals("CTF_TYPE_NAME")){ xpp.next(); // 텍스트로 이동 typeName = xpp.getText(); // 텍스트 가져옴 while(true) { xpp.next(); if(xpp.getEventType()==XmlPullParser.START_TAG && xpp.getName().equals("CTF_NAME")){ xpp.next(); ctfName = xpp.getText(); break; } } while(true) { xpp.next(); if(xpp.getEventType()==XmlPullParser.START_TAG && xpp.getName().equals("CTF_ADDR")){ xpp.next(); ctfAddr = xpp.getText(); break; } } while(true) { xpp.next(); if(xpp.getEventType()==XmlPullParser.START_TAG && xpp.getName().equals("CTF_TEL")){ xpp.next(); ctfTel = xpp.getText()==null || xpp.getText().equals("") ? "" : xpp.getText(); break; } } strBuilder.append(typeName+":"+ctfName+":"+ctfAddr+":"+ctfTel+"\n\n"); } // end of if(STF_TYPE_NAME) } // end of if( START_TAG) xpp.next(); } // end of while() handler.post(new Runnable() { public void run() { tv.append(strBuilder.toString()); } }); }catch(Exception ex) { ex.printStackTrace(); Log.e("접속오류", ex.toString()); } } }


참고로 '서울안심먹거리 목록' 의 데이터 포맷은 다음과 같은 형태로 구성된다

<?xml version="1.0" encoding="UTF-8"?>

<서울안심먹거리목록>
<row1>
<CTF_CODE>306</CTF_CODE>
<CTF_TYPE>1</CTF_TYPE>
<CTF_TYPE_NAME>원산지표시 우수음식점</CTF_TYPE_NAME>
<CTF_GU>1</CTF_GU>
<CTF_NAME>한우리외식산업(주)</CTF_NAME>
<CTF_X>203073.5486</CTF_X>
<CTF_Y>446852.3622</CTF_Y>
<CTF_ADDR>강남구 논현동 91-18</CTF_ADDR>
<CTF_TEL>545-3334</CTF_TEL>
</row1>
<row2>
<CTF_CODE>304</CTF_CODE>
<CTF_TYPE>1</CTF_TYPE>
<CTF_TYPE_NAME>원산지표시 우수음식점</CTF_TYPE_NAME>
<CTF_GU>1</CTF_GU>
<CTF_NAME>한서외식산업(주)</CTF_NAME>
<CTF_X>203110.8549</CTF_X>
<CTF_Y>446894.9602</CTF_Y>
<CTF_ADDR>강남구 논현동 91-4 지하1층, 지상3,4,5층</CTF_ADDR>
<CTF_TEL>541-4277</CTF_TEL>
</row2>
<row3>
<CTF_CODE>281</CTF_CODE>
<CTF_TYPE>1</CTF_TYPE>
<CTF_TYPE_NAME>원산지표시 우수음식점</CTF_TYPE_NAME>
<CTF_GU>1</CTF_GU>
<CTF_NAME>한미리</CTF_NAME>
<CTF_X>205718.8580</CTF_X>
<CTF_Y>445010.7262</CTF_Y>
<CTF_ADDR>강남구 대치동 968-4</CTF_ADDR>
<CTF_TEL>556-4834</CTF_TEL>
</row3>
</서울안심먹거리목록>