펌(원본 : http://superjini.tistory.com/17)

 

기상청에서 제공하는 xml을 파싱해서 php용으로 만들어 봤습니다.


항상 하는 얘기지만 잘 하시는 분들은 패스하세요 하다보니 소스도 없고

xml 파싱 함수 사용도 어렵고 게다가 버전 4. 대고 해서 ㅜㅜ

임의대로 만들어 봤네요.

일단 두가지가 있습니다.

하나는 기상대가 있는 지역의 날씨를 1시간단위로 업데이트하는 xml 이고 ==> weather_xml_parser()

둘째는 해당지역의 좌표를 이용해서 3일간 날씨를 예보하는 xml입니다. ==> rea_weather_xml_parser($x,$y)

해당지역 좌표는 아래 보이는 사이트 http://www.kma.go.kr/weather/lifenindustry/sevice_rss.jsp 가서 확인해 보면 되고..



아래 함수들은 리턴 값 print_r 로 한번 찍어보시고 취향에 맞게 수정해서 사용하시면 되겠네요!!!

앞에서 얘기했듯이 고수 중수 분들은 알아서.....하시면 됩니다. ^^;;;

초보분들도 알아서 하시면 되겠네요......


< ?
class KmaWeather
{
//1시간단위로 기상대가 있는 지역의 날씨를 가져온다.
function weather_xml_parser()
{
$array = array();

$url1="www.kma.go.kr";
$url2="GET /";
$url2.="XML/weather/sfc_web_map.xml";
$url2.=" HTTP/1.0\r\nHost:www.kma.go.kr\r\n\r\n";

$fp2 = fsockopen ($url1, 80, $errno, $errstr,30 );
if (!$fp2) echo "? $errstr ($errno)<br />n";
else
{
fputs ($fp2, $url2);
while (!feof($fp2))
{
$line=fgets ($fp2,512);
if(ereg("<local",$line))
{
$area=preg_split("/\>/",$line);
$area=preg_split("/\</",$area[1]);
$area =$this-> iconv_UTF_8($area[0]);
$array[$area]=$this-> iconv_UTF_8($area[0]);//지역설정

$value=preg_split("/\"/",$line);
$array[$area]['icon']= $this-> iconv_UTF_8($value[3]); //아이콘 변수현재상태
$array[$area]['desc']= $this-> iconv_UTF_8($value[5]); //현재상태 한글 / 맑음 흐림 구름많음 박무 구름조금
$array[$area]['temp']=$this-> iconv_UTF_8($value[7]); //현재온도
}
// echo iconv('UTF-8','EUC-KR',$value[1]).'=='.iconv('UTF-8','EUC-KR',$value[3]).'=='.iconv('UTF-8','EUC-KR',$value[5]).'=='.iconv('UTF-8','EUC-KR',$value[7])."</br>";
}
}
fclose($fp2);
return $array;
}
#
//해당 좌표의 동네 날씨를 가져온다. 해당좌표는 기상청사이트=> http://www.kma.go.kr/weather/lifenindustry/sevice_rss.jsp 가서 확인해 보시면 됩니다.
function area_weather_xml_parser($x,$y)
{
$array = array();

$url1="www.kma.go.kr";
$url2="GET /";
$url2.="wid/queryDFS.jsp?gridx=".$x."&gridy=".$y;
$url2.=" HTTP/1.0\r\nHost:www.kma.go.kr\r\n\r\n";

$fp2 = fsockopen ($url1, 80, $errno, $errstr,30 );
if (!$fp2) echo "? $errstr ($errno)<br />n";
else
{
fputs ($fp2, $url2);
$i = 0; $j=0;
while (!feof($fp2))
{
$line=fgets ($fp2,512);
if(ereg("<tm>",$line))$array[date]= $this->iconv_UTF_8(trim(strip_tags($line)));
if($i==$j++ && ereg("<data",$line))
{
$area=preg_split("/\"/",$line);
$area=preg_split("/\"/",$area[1]);
$number = iconv_UTF_8($area[0]);// iconv('UTF-8','EUC-KR',$area[0]);

$array[$i]= $number;
}

if(ereg("<hour>",$line))$array[$i]['hour']=$this-> iconv_UTF_8(trim(strip_tags($line))); //시간 18일 경우 15~18시
if(ereg("<day>",$line))$array[$i]['day']= $this->iconv_UTF_8(trim(strip_tags($line))); //0:오늘 1:내일 2:모레
if(ereg("<temp>",$line))$array[$i]['temp']=$this-> iconv_UTF_8(trim(strip_tags($line))); //현재시간온도
if(ereg("<pty>",$line))$array[$i]['pty']=$this-> iconv_UTF_8(trim(strip_tags($line))); //강수상태코드 0:없음 1:비 2: 비/눈 3: 눈/비 4:눈
if(ereg("<wfKor>",$line))$array[$i]['wfkor']=$this-> iconv_UTF_8(trim(strip_tags($line))); //날씨한국어 1:맑음 2:구름조금 3:구름많음 4:흐림 5:비 6:눈/비 7:눈
if(ereg("<wfEn>",$line))$array[$i]['wfen']=$this-> iconv_UTF_8(trim(strip_tags($line))); //날씨영어 1:Clearly 2:Little Cloudy 3:Mostly Cloudy 4:Cloudy 5:Rainy 6:Snow/Rain 7:Snow
if(ereg("<pop>",$line))$array[$i]['pop']= $this->iconv_UTF_8(trim(strip_tags($line))); //강수확률%
//바람인 강수확률은 제외 필요하신분은 기상청에서 제공하는 pdf파일 참조해서 추가하세요
if(ereg("</data>",$line))$i++;
}
}
fclose($fp2);

return $array;
}

function iconv_UTF_8($str)
{
return iconv('UTF-8','EUC-KR',$str);
}
}

$obj = new KmaWeather;

//테스트용 코드 $obj->area_weather_xml_parser('69','106') //한번 찍어보시고 취향에 맞게 변경해서 사용하시면 되겠지여
echo print_r($obj->weather_xml_parser());
?>