22.07.26-외부 데이터 받기(XML)
기상청 데이터 받기
package com.lsc.jul26nw.main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class Main {
public static void main(String[] args) {
String addr = "http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=4141062000";
try{
URL u= new URL(addr);
HttpURLConnection huc = (HttpURLConnection) u.openConnection();
InputStream is = huc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
parsing
XML 파싱을 할때 사용하는 파일
XML(eXtended Markup Language)
데이터를 HTML모양으로 표현해 놓은 것
DOM(Document Object Model) 객체:
<xxx 속성명 =”값” 속성명 =”값”..> 속성은 몇개가 들어가도 상관 없다. : 시작태그
YYY: 글자
: 종료 태그
외부 라이브러리를 사용한 데이터 추출
기본 형식
package com.lsc.jul26nw.main;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
//
public class Main {
public static void main(String[] args) {
String addr = "http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=4141062000";
try{
URL u= new URL(addr);
HttpURLConnection huc = (HttpURLConnection) u.openConnection();
InputStream is = huc.getInputStream();
// InputStreamReader isr = new InputStreamReader(is);
// BufferedReader br = new BufferedReader(isr);
String line = null;
XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
//외부 라이브러리 사용
XmlPullParser xpp = xppf.newPullParser();
xpp.setInput(is,"utf-8");//XML은 대부분 UTF-8로 인코딩 되어있다.
int what = xpp.getEventType(); //처음에 시작되는 값
while(what != XmlPullParser.END_DOCUMENT){//문서의 끝이 된다면
if(what == XmlPullParser.START_TAG){
System.out.println(xpp.getName()); //태그 이름만 출력
}else if (what==XmlPullParser.TEXT) {
System.out.println(xpp.getText());//안쪽에 있는 데이터만 출력
} else if (what == XmlPullParser.END_TAG) {
System.out.println(xpp.getName());// "/"가 빠져있는 태그의 끝이 출력
}
xpp.next();
what = xpp.getEventType();//
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
hour만 추출
package com.lsc.jul26nw.main;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
//
public class Main {
public static void main(String[] args) {
String addr = "http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=4141062000";
try{
URL u= new URL(addr);
HttpURLConnection huc = (HttpURLConnection) u.openConnection();
InputStream is = huc.getInputStream();
//외부 라이브러리 사용
XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
XmlPullParser xpp = xppf.newPullParser();
xpp.setInput(is,"utf-8");//XML은 대부분 UTF-8로 인코딩 되어있다.
int what = xpp.getEventType(); //처음에 시작되는 값
String t = null;
while(what != XmlPullParser.END_DOCUMENT){//문서의 끝이 된다면
if(what == XmlPullParser.START_TAG){
t = xpp.getName();
}else if (what==XmlPullParser.TEXT) {
if(t.equals("hour")){
System.out.println(xpp.getText()+"시 까지");
}else if(t.equals("temp")){
System.out.printf("%sC",xpp.getText());
} else if (t.equals("wfKor")) {
System.out.println(xpp.getText());
}
} else if (what == XmlPullParser.END_TAG) {
t="";//XML파일에 태그 끝에 엔터(\r\n)이 되어있어서 그걸 초기화 해줘야함 -> 안하면 text로 읽힘
}
xpp.next(); // 순서가 태그 시작 -> 데이터 -> 태그 끝 -> 다음 태그 시작 순으로 연속된다.
what = xpp.getEventType();//
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
NetWork
공공데이터 사이트
공공데이터를 사용해서 미세먼지 농도 나오게 하기
코드
package com.lsc.nw.main;
import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class NTMain {
public static void main(String[] args) {
String addr = "http://openapi.seoul.go.kr:8088/575a4655496b636839386f58586542/xml/RealtimeCityAir/1/25/";
try{
URL u = new URL(addr);
HttpURLConnection huc = (HttpURLConnection) u.openConnection();
InputStream is = huc.getInputStream();
XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
XmlPullParser xpp = xppf.newPullParser();
xpp.setInput(is,"UTF-8");
int what = xpp.getEventType();
String temp=null;
while(what!=XmlPullParser.END_DOCUMENT){
if(what == XmlPullParser.START_TAG){
temp = xpp.getName();
} else if (what == XmlPullParser.TEXT) {
if(temp.equals("MSRRGN_NM")){
System.out.print(xpp.getText()+" ");
} else if (temp.equals("MSRSTE_NM")) {
System.out.println(xpp.getText());
} else if (temp.equals("PM10")) {
System.out.println("미세먼지 농도 : "+xpp.getText()+" ㎍/㎥");
} else if (temp.equals("PM25")) {
System.out.println("초미세먼지 농도 : "+xpp.getText()+" ㎍/㎥");
} else if (temp.equals("IDEX_NM")) {
System.out.println("오염 정도 : "+xpp.getText());
System.out.println();
}
} else if (what==XmlPullParser.END_TAG) {
temp="";
}
xpp.next();
what = xpp.getEventType();
}
is.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
package com.lsc.nw.main;
import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import javax.imageio.stream.FileImageOutputStream;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
public class NTMain {
public static void main(String[] args) {
String addr = "http://openapi.seoul.go.kr:8088/575a4655496b636839386f58586542/xml/RealtimeCityAir/1/25/";
try{
URL u = new URL(addr);
HttpURLConnection huc = (HttpURLConnection) u.openConnection();
InputStream is = huc.getInputStream();
XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
XmlPullParser xpp = xppf.newPullParser();
xpp.setInput(is,"UTF-8");
//파일로 입력
FileOutputStream fos = new FileOutputStream("D:\\LSC\\Java\\Java_Study_SL\\Jul26\\dust.csv",true);
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
int what = xpp.getEventType();
String temp=null;
while(what!=XmlPullParser.END_DOCUMENT){
if(what == XmlPullParser.START_TAG){
temp = xpp.getName();
} else if (what == XmlPullParser.TEXT) {
if(temp.equals("MSRDT")){
String date = xpp.getText();
System.out.println(date.substring(0,4)+"년 "+date.substring(4,6)+"월 "+date.substring(6,8)+"일 "+date.substring(8,10)+"시 "+date.substring(10,12)+"분 ");
bw.write(date.substring(0,4)+"년 "+date.substring(4,6)+"월 "+date.substring(6,8)+"일 "+date.substring(8,10)+"시 "+date.substring(10,12)+"분 "+",");
}else if(temp.equals("MSRRGN_NM")){
System.out.print(xpp.getText()+",");
bw.write(xpp.getText());
} else if (temp.equals("MSRSTE_NM")) {
System.out.println(xpp.getText());
bw.write(xpp.getText()+",");
} else if (temp.equals("PM10")) {
System.out.println("미세먼지 농도 : "+xpp.getText()+" ㎍/㎥");
bw.write("미세먼지 농도 : "+xpp.getText()+" ㎍/㎥"+",");
} else if (temp.equals("PM25")) {
System.out.println("초미세먼지 농도 : "+xpp.getText()+" ㎍/㎥");
bw.write("초미세먼지 농도 : "+xpp.getText()+" ㎍/㎥"+",");
} else if (temp.equals("IDEX_NM")) {
System.out.println("오염 정도 : "+xpp.getText());
bw.write("오염 정도 : "+xpp.getText()+"\r\n");
System.out.println();
}
} else if (what==XmlPullParser.END_TAG) {
temp="";
}
xpp.next();
what = xpp.getEventType();
}
is.close();
bw.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
네이버 개발자 API 사용
코드
package com.lsc.nw.main;
import org.xmlpull.v1.XmlPullParserFactory;
import java.awt.*;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;
//DevNaver ID: FH2X7xmgHzfhxZOwmM4K
//DevNaver PW: Xl615uK2WK
// https://openapi.naver.com/v1/search/news.xml
public class NTMain2 {
public static void main(String[] args) {
String addr = "https://openapi.naver.com/v1/search/news.xml?query=q";
Scanner input = new Scanner(System.in);
System.out.println("뭐 : ");
String q = input.next();
try{
q = URLEncoder.encode(q,"UTF-8");
URL u = new URL(addr);
HttpURLConnection huc = (HttpURLConnection) u.openConnection();
huc.addRequestProperty("X-Naver-Client-Id","FH2X7xmgHzfhxZOwmM4K");
huc.addRequestProperty("X-Naver-Client-Secret","Xl615uK2WK");
InputStream is = huc.getInputStream();
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
BufferedReader br = new BufferedReader(isr);
System.out.println(br.readLine());
}catch (Exception e){
}
}
}
package com.lsc.nw.main;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.awt.*;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;
//DevNaver ID: FH2X7xmgHzfhxZOwmM4K
//DevNaver PW: Xl615uK2WK
// https://openapi.naver.com/v1/search/news.xml
public class NTMain2 {
public static void main(String[] args) {
String addr = "https://openapi.naver.com/v1/search/news.xml?sort=sim&display=10&query=";
Scanner input = new Scanner(System.in);
System.out.println("뭐 : ");
String q = input.next();
try{
q = URLEncoder.encode(q,"UTF-8");
URL u = new URL(addr+q);
HttpURLConnection huc = (HttpURLConnection) u.openConnection();
huc.addRequestProperty("X-Naver-Client-Id","FH2X7xmgHzfhxZOwmM4K");
huc.addRequestProperty("X-Naver-Client-Secret","Xl615uK2WK");
//xpp.setInput에 필요해서 설정함
InputStream is = huc.getInputStream();
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
BufferedReader br = new BufferedReader(isr);
XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
XmlPullParser xpp = xppf.newPullParser();
xpp.setInput(is,"UTF-8");
int what = xpp.getEventType();
String t= null;
while(what!=XmlPullParser.END_DOCUMENT){
if(what==XmlPullParser.START_TAG){
t= xpp.getName();
} else if (what==XmlPullParser.TEXT) {
if(t.equals("title")){
System.out.println(xpp.getText());
} else if (t.equals("description")) {
System.out.println(xpp.getText()+"\r\n");
}
} else if (what==XmlPullParser.END_TAG) {
}
xpp.next();
what = xpp.getEventType();
}
}catch (Exception e){
System.out.println(e);
}
}
}
package com.lsc.nw.main;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.awt.*;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;
//DevNaver ID: FH2X7xmgHzfhxZOwmM4K
//DevNaver PW: Xl615uK2WK
// https://openapi.naver.com/v1/search/news.xml
public class NTMain2 {
public static void main(String[] args) {
String addr = "https://openapi.naver.com/v1/search/news.xml?sort=sim&display=10&query=";
Scanner input = new Scanner(System.in);
System.out.println("뭐 : ");
String q = input.next();
try{
q = URLEncoder.encode(q,"UTF-8");
URL u = new URL(addr+q);
HttpURLConnection huc = (HttpURLConnection) u.openConnection();
huc.addRequestProperty("X-Naver-Client-Id","FH2X7xmgHzfhxZOwmM4K");
huc.addRequestProperty("X-Naver-Client-Secret","Xl615uK2WK");
//xpp.setInput에 필요해서 설정함
InputStream is = huc.getInputStream();
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
BufferedReader br = new BufferedReader(isr);
XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
XmlPullParser xpp = xppf.newPullParser();
xpp.setInput(is,"UTF-8");
int what = xpp.getEventType();
String t= null;
boolean data =false;//앞에 쓸데없는거 제거
while(what!=XmlPullParser.END_DOCUMENT){
if(what==XmlPullParser.START_TAG){
t= xpp.getName();
if(t.equals("item")){
data = true;
}
} else if (what==XmlPullParser.TEXT) {
if(data){
if(t.equals("title")){
System.out.println(StringCleaner.clean(xpp.getText()));
} else if (t.equals("description")) {
System.out.println(StringCleaner.clean(xpp.getText())+"\r\n");
}
}
} else if (what==XmlPullParser.END_TAG) {
}
xpp.next();
what = xpp.getEventType();
}
}catch (Exception e){
System.out.println(e);
}
}
}
JSON
JavaScript에서 파일을 보내고 받기위해 만든 형식
뷰어
내용
{} : 객체
[ ] : 배열 →인덱스로 접근 가능
코드
package com.lsc.nw.main;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class NWMain3 {
public static void main(String[] args) {
String addr = "http://openapi.seoul.go.kr:8088/575a4655496b636839386f58586542/json/CardSubwayStatsNew/1/548/20151101";
try {
URL u = new URL(addr);
HttpURLConnection huc = (HttpURLConnection) u.openConnection();
InputStream is = huc.getInputStream();
InputStreamReader isr = new InputStreamReader(is,"utf-8");
//JSON , JSONViewer로 하나하나 객체인지 배열인지 확인하면서 작성해야함
JSONParser jp = new JSONParser();
// JSONArray ja = jp.parse(isr);//JSON 시작이 []배열로 되어있을때
JSONObject jo = (JSONObject) jp.parse(isr); // Json 시작이 {}이렇게 되어있을때
JSONObject cssn = (JSONObject) jo.get("CardSubwayStatsNew");//객체 안에 있는 "변수"를 찾아라
JSONArray r = (JSONArray) cssn.get("row");//CardSubwayStatsNew 안에 row 배열을 찾아라
for(int i =0; i<r.size();i++){
JSONObject station = (JSONObject) r.get(i);
System.out.println(station.get("LINE_NUM"));
System.out.println(station.get("SUB_STA_NM"));
System.out.println(station.get("RIDE_PASGR_NUM"));
System.out.println(station.get("ALIGHT_PASGR_NUM"));
System.out.println("-----------------------------------");
}
}catch (Exception e){
e.printStackTrace();
}
}
}
미세먼지
package com.lsc.nw.main;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class NWMain4 {
public static void main(String[] args) {
String addr = "http://openapi.seoul.go.kr:8088/575a4655496b636839386f58586542/json/RealtimeCityAir/1/25/";
try{
URL u = new URL(addr);
HttpURLConnection huc = (HttpURLConnection) u.openConnection();
InputStream is = huc.getInputStream();
InputStreamReader isr = new InputStreamReader(is,"utf-8");
JSONParser jp = new JSONParser();
JSONObject jo = (JSONObject) jp.parse(isr);
JSONObject cssn = (JSONObject) jo.get("RealtimeCityAir");
JSONArray r = (JSONArray) cssn.get("row");
for(int i =0; i<r.size(); i++){
JSONObject statation = (JSONObject) r.get(i);
System.out.println(statation.get("MSRDT"));
System.out.println(statation.get("MSRRGN_NM")+""+statation.get("MSRSTE_NM"));
System.out.println("미세먼지 : "+statation.get("PM10"));
System.out.println("초미세먼지 : "+statation.get("PM25"));
System.out.println("오늘 미세먼지 : "+statation.get("IDEX_NM"));
System.out.println("--------------------------------------------");
}
}catch (Exception e){
e.printStackTrace();
}
}
}
날씨받기
package com.lsc.nw.main;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.time.LocalDate;
import java.util.Date;
import java.util.Scanner;
public class NWMain5 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String location = input.next();
String addr="https://api.openweathermap.org/data/2.5/weather?q="+location+"&appid=baff8f3c6cbc28a4024e336599de28c4&units=metric&lang=kr";
try{
URL u = new URL(addr);
HttpURLConnection huc = (HttpURLConnection) u.openConnection();
InputStream is = huc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
JSONParser jp = new JSONParser();
JSONObject jo = (JSONObject) jp.parse(isr);
System.out.println("지역 : " + jo.get("name"));
while(true) {
JSONArray ja = (JSONArray) jo.get("weather");
JSONObject weather = (JSONObject) ja.get(0);
JSONObject temp = (JSONObject) jo.get("main");
System.out.println(LocalDate.now());
System.out.println(weather.get("description"));
System.out.println("최대 기온 : " + temp.get("temp_max") + " C" + " 최저 기온 :" + temp.get("temp_min") + " C");
Thread.sleep(5000);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
'Program > JAVA' 카테고리의 다른 글
| JAVA 실행 과정의 이해 (0) | 2022.12.25 |
|---|---|
| 개발 분야, CMD에서 JAVA 실행, GUI (0) | 2022.12.25 |
| Java문법[Waring과 Error, Try/Catch, throws, String, Wrapper Class, IO, NetWorks] (1) | 2022.12.25 |
| 싱글톤(Singleton, 다형성, 추상화, 인터페이스(Interface) (1) | 2022.12.25 |
| || | , && &, 간단 게임 만들기 (0) | 2022.12.25 |