투케이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();
	}
}

/* =========================== */

/* =========================== */

[결과 출력]

/* =========================== */​

반응형
Comments