[안드로이드] - 공공데이터 API 2개 이상 XML 파싱하기
○ 공공데이터 API 2개 이상 XML 파싱하기 |
앞서서 사용했던 공공데이터 XML 파싱하여 활용하기 (1) (2)를 버튼하나로 파싱해보기 public class MainActivity extends AppCompatActivity { EditText edit; TextView text, text2; String key="(발급받은 서비스 키)"; String key2="(발급받은 서비스 키)"; String data; String data2; @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); text2= (TextView)findViewById(R.id.text2); } // 버튼 하나를 통해 2개의 쓰레드를 돌려서 각각의 api의 데이터를 가져와 출력 public void mOnClick(View v){ switch( v.getId() ){ case R.id.button:
new Thread(new Runnable() { @Override public void run() { //아래 메소드를 호출하여 XML data를 파싱해서 String 객체로 얻어오기 data= getXmlData(); data2= getXmlData2(); runOnUiThread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub text.setText(data); text2.setText(data2); } }); } }).start(); break; } } String getXmlData(){ StringBuffer buffer=new StringBuffer(); String queryUrl="http://openapi.seoul.go.kr:8088/" + key + "/xml/ListAirQualityByDistrictService/1/25/"; 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("MSRSTENAME")){ buffer.append("구 이름 : "); xpp.next(); buffer.append(xpp.getText()); // MSRSTENAME 요소의 TEXT 읽어와서 문자열버퍼에 추가 buffer.append("\n"); // 줄바꿈 문자 추가 } else if(tag.equals("GRADE")){ buffer.append("상태 : "); xpp.next(); buffer.append(xpp.getText()); buffer.append("\n"); } else if(tag.equals("PM10")){ buffer.append("미세먼지 :"); xpp.next(); buffer.append(xpp.getText());//cpId buffer.append("\n"); } else if(tag.equals("PM25")){ buffer.append("초미세먼지 :"); xpp.next(); buffer.append(xpp.getText());//cpNm buffer.append("\n"); } else if(tag.equals("OZONE")){ buffer.append("오존 :"); xpp.next(); buffer.append(xpp.getText());// buffer.append("\n"); } else if(tag.equals("NITROGEN")){ buffer.append("이산화질소 :"); xpp.next(); buffer.append(xpp.getText());// buffer.append("\n"); } else if(tag.equals("CARBON")){ buffer.append("일산화탄소 :"); xpp.next(); buffer.append(xpp.getText());//csId buffer.append("\n"); } else if(tag.equals("SULFUROUS")){ 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("PM25")) buffer.append("\n"); // 첫번째 검색결과종료..줄바꿈 break; } eventType= xpp.next(); } } catch (Exception e) { // TODO Auto-generated catch blocke.printStackTrace(); } buffer.append("파싱 끝\n"); return buffer.toString();//StringBuffer 문자열 객체 반환 } String getXmlData2(){ 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=" + key2; try { URL url= new URL(queryUrl); InputStream is= url.openStream(); XmlPullParserFactory factory= XmlPullParserFactory.newInstance(); XmlPullParser xpp= factory.newPullParser(); xpp.setInput( new InputStreamReader(is, "UTF-8") ); 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()); 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 문자열 객체 반환 } } |
'안드로이드' 카테고리의 다른 글
[안드로이드] - CardView 에 FadeIn 애니메이션 효과주기 (0) | 2018.05.18 |
---|---|
[안드로이드] - 날씨 공공데이터 DOM 파싱, 복잡한 파싱하기 (1) | 2018.05.17 |
[안드로이드] - 공공데이터 XML 파싱하여 활용하기 (2) (1) | 2018.05.17 |
[안드로이드] - 공공데이터 XML 파싱하여 활용하기 (1) (1) | 2018.05.17 |
[안드로이드] - drawable에서 벡터 아이콘 사용 및 응용하기 (0) | 2018.04.26 |