반응형
% 웹에서 데이터를 가져오는 방법은 "JSON"과 "XML"이 있습니다. 여기서는 "XML" 위주로 설명합니다.
% 공공데이터를 가져오려면 서비스 키를 신청해야 합니다. 문제가 없는 경우 바로 발급됩니다. 결과를 이메일로 보내주지 않기 때문데 공공데이터 포털에서 직접 확인해야 합니다.
아래는 현재 위치의 온도를 가져오는 URL 예제입니다. 강남구 기준으로 데이터를 가져옵니다.
StringBuilder strURL = new StringBuilder("http://apis.data.go.kr/1360000/VilageFcstInfoService/getUltraSrtNcst?");
strURL.Append("serviceKey=");
strURL.Append(myServiceKey);
strURL.Append("&base_date=20200706");
strURL.Append("&base_time=1000");
strURL.Append("&nx=61&ny=125");
위에서 만들어진 URL을 이용합니다.
다음은 XmlReader를 사용하여 웹에서 데이터를 가져오는 코드입니다.
XmlDocument XmlDoc = new XmlDocument();
XmlReader reader = XmlReader.Create(strURL.ToString());
XmlDoc.Load(reader);
reader.Close();
이렇게 하였으나 종종
"The remote server returned an error: (500) Internal Server Error."
"원격 서버에서 (500) 내부 서버 오류 오류를 반환했습니다."
오류가 발생하였습니다.
그래서 아래와 같이 변경하였습니다.
XmlDocument XmlDoc = new XmlDocument();
// For Timeout.
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Ignore;
XmlReader reader = XmlReader.Create(strRead.ToString(), settings);
XmlDoc.Load(reader); // File = XmlDoc.Load, String = XmlDoc.LoadXml
reader.Close();
여기서 XmlReaderSettings은 타임아웃을 방지하려고 사용하였습니다.
그러나 이방식 역시 오류가 많이 줄어는 들었으나 같은 오류가 간혹 발생합니다.
다시 아래와 같이 변경하였습니다.
XmlDocument XmlDoc = new XmlDocument();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strRead.ToString());
request.UserAgent = "My User Agent";
XmlDoc.Load(request.GetResponse().GetResponseStream());
오류가 생기는지 테스트 중입니다.
데이터를 분석하는 부분입니다.
XmlNodeList Nodes2 = XmlDoc.SelectNodes("//response/body/items/item"); // location 1번째 node (서울)의 하위data node
string data2 = "";
foreach (XmlNode Node in Nodes2)
{
XmlNode date = Node.SelectSingleNode("baseDate");
XmlNode time = Node.SelectSingleNode("baseTime");
XmlNode catagory = Node.SelectSingleNode("category");
XmlNode value = Node.SelectSingleNode("obsrValue");
data2 += date.InnerText + "\t"
+ time.InnerText + "\t"
+ catagory.InnerText + "\t"
+ value.InnerText + "\n";
// Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { lbl.Content += n.LocalName; }));
if (catagory.InnerText.Equals("T1H"))
{
cTemperature.Value = double.Parse(value.InnerText);
}
}
오류가 안 나오길 바래봅니다.
반응형
'Windows' 카테고리의 다른 글
OPC.DA x64 버전 (0) | 2020.07.30 |
---|---|
OPC.DA 관련 (6) | 2020.07.07 |
엑셀 시간 서식에서 초 이하 표시하기 (0) | 2020.07.03 |
MS Access Query 직접 입력하기 (0) | 2020.07.02 |
MS Access 관련 정보들 (0) | 2020.06.30 |