Notice
Recent Posts
Recent Comments
Link
투케이2K
147. (AndroidStudio/android/java) 기상청 RSS 페이지 http 요청 및 xml 데이터 파싱 실시 본문
Android
147. (AndroidStudio/android/java) 기상청 RSS 페이지 http 요청 및 xml 데이터 파싱 실시
투케이2K 2021. 5. 14. 17:25/* =========================== */
[ 개발 환경 설정 ]
개발 툴 : AndroidStudio
개발 언어 : java
/* =========================== */
/* =========================== */
[소스 코드]
//TODO [기상청 전국 날씨 RSS HTTP 요청]
getRequestHttpGET("https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108");
//TODO [기상청 전국 날씨 RSS HTTP 수행]
public void getRequestHttpGET(String url) {
try {
//TODO [AsyncHttpClient 객체 정의]
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
Log.d("---","---");
Log.d("//===========//","================================================");
Log.d("","\n"+"[A_Http > getRequestHttpGET() 메소드 : HTTP 통신 수행 GET 방식 요청 실시]");
Log.d("","\n"+"["+"요청 주소 - "+String.valueOf(url)+"]");
Log.d("","\n"+"["+"전송 값 - "+String.valueOf(params)+"]");
Log.d("","\n"+"["+"전송 형태 - "+String.valueOf(url+"?"+params)+"]");
Log.d("//===========//","================================================");
Log.d("---","---");
//TODO [서버에 요청]
client.get(A_Http.this, url, params, new AsyncHttpResponseHandler() { //TODO 두번째 타입
//TODO [웹요청 시작]
@Override
public void onStart() {
}
//TODO [웹요청 성공]
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) { //TODO 두번째 타입
String responseData = String.valueOf(new String(response));
Log.d("---","---");
Log.w("//===========//","================================================");
Log.d("","\n"+"[A_Http > getRequestHttpGET() 메소드 : HTTP 통신 수행 GET 방식 요청 성공]");
Log.d("","\n"+"["+"응답 전체 - "+String.valueOf(responseData)+"]");
Log.w("//===========//","================================================");
Log.d("---","---");
//TODO [xml 파싱 수행]
getWeather(responseData);
}
//TODO [웹요청 실패]
@Override
public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable throwable) { //TODO 두번째 타입
String responseError = String.valueOf(new String(errorResponse));
Log.d("---","---");
Log.e("//===========//","================================================");
Log.d("","\n"+"[A_Http > getRequestHttpGET() 메소드 : HTTP 통신 수행 GET 방식 요청 실패]");
Log.d("","\n"+"["+"에러코드 - "+String.valueOf(statusCode + "/" + responseError +"]"));
Log.e("//===========//","================================================");
Log.d("---","---");
}
});
}
catch (Exception e){
e.printStackTrace();
}
}
//TODO [XML 파싱 메소드]
public void getWeather(String xmlData){
Log.d("---","---");
Log.d("//===========//","================================================");
Log.d("","\n"+"[A_Http > getWeather() 메소드 : XML 데이터 파싱 실시]");
Log.d("//===========//","================================================");
Log.d("---","---");
try {
//TODO [Document를 생성할 Factory 생성]
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//TODO [Builder 객체를 생성]
DocumentBuilder builder = factory.newDocumentBuilder();
//TODO [string 형태의 xml데이터를 InputStream에 담는다]
InputStream istream = new ByteArrayInputStream(xmlData.getBytes("utf-8"));
//TODO [InputStream으로 Document를 생성]
Document doc = builder.parse(istream);
//TODO [Document 최상위 Element 객체 생성]
Element root = doc.getDocumentElement();
//TODO [개별 태그값 파싱 - 젤 먼저 찾은 태그 값을 가져온다]
/**
* [형태]
* <pubDate>2021년 05월 14일 (금)요일 06:00</pubDate>
* */
NodeList first_node = root.getElementsByTagName("pubDate");
Element first_element = (Element) first_node.item(0);
//TODO [다중 태그값 파싱]
/**
* [형태]
* <title>기상청 육상 중기예보</title>
* <title>전국 육상 중기예보 - 2021년 05월 14일 (금)요일 06:00 발표</title>
* <title>전국 육상중기예보</title>
* */
NodeList multi_node = root.getElementsByTagName("title");
ArrayList multi_list = new ArrayList();
for (int i = 0; i<multi_node.getLength(); i++){
Element multi_element = (Element) multi_node.item(i);
multi_list.add(String.valueOf(multi_element.getFirstChild().getNodeValue()));
}
//TODO [다중 세부 태그값 파싱]
/**
* [형태]
* <data>
* <mode>A02</mode>
* <wf>흐리고 비</wf>
* </data>
*
* <data>
* <mode>A02</mode>
* <wf>구름많음</wf>
* </data>
* */
NodeList multi_detail_node = root.getElementsByTagName("data");
ArrayList multi_detail_list = new ArrayList();
for (int i = 0; i<multi_detail_node.getLength(); i++){
//TODO [data 전체]
Element multi_detail_element = (Element) multi_detail_node.item(i);
//TODO [data 에서 세부 태그 찾기]
NodeList mode_node = multi_detail_element.getElementsByTagName("mode");
Element mode_element = (Element) mode_node.item(0);
String mode_data = String.valueOf(mode_element.getFirstChild().getNodeValue());
//TODO [data 에서 세부 태그 찾기]
NodeList wf_node = multi_detail_element.getElementsByTagName("wf");
Element wf_element = (Element) wf_node.item(0);
String wf_data = String.valueOf(wf_element.getFirstChild().getNodeValue());
//TODO [배열에 데이터 삽입]
String format = "{"+mode_data+":"+wf_data+"}";
if (multi_detail_list.contains(format) == false){ //TODO [중복 저장 않함]
multi_detail_list.add(format);
}
}
//TODO [데이터 출력 실시]
Log.d("---","---");
Log.w("//===========//","================================================");
Log.d("","\n"+"[A_Http > getWeather() 메소드 : XML 데이터 파싱 데이터 확인]");
Log.d("","\n"+"[root : "+String.valueOf(root.getTagName())+"]");
Log.d("","\n"+"[pubDate [개별] : "+String.valueOf(first_element.getFirstChild().getNodeValue())+"]");
Log.d("","\n"+"[title [다중] : "+String.valueOf(multi_list.toString())+"]");
Log.d("","\n"+"[data [세부] : "+String.valueOf(multi_detail_list.toString())+"]");
Log.w("//===========//","================================================");
Log.d("---","---");
}
catch (Exception e){
e.printStackTrace();
}
}
/* =========================== */
/* =========================== */
[결과 출력]
/* =========================== */
반응형
'Android' 카테고리의 다른 글
Comments