외부 XML 주소를 읽어서 PHP 상에서 파싱하는 작업은 크게 두 단계로 나뉩니다.
① 외부 XML 데이터 가져오기
② XML 데이터 파싱하기
아래는 간단한 예제를 통해 각 단계를 설명한 뒤, 공공데이타 포탈에서 XML 자료를 파싱하는 방법을 소개한다.
외부 XML 데이터 가져오기
file_get_contents() 함수나 cURL을 사용하여 외부 XML 주소의 데이터를 가져올 수 있습니다. 여기서는 file_get_contents() 함수를 사용하는 방법을 설명하겠습니다.
PHP
$xmlUrl = "https://example.com/sample.xml"; // 외부 XML 주소
$xmlData = file_get_contents($xmlUrl);
XML 데이터 파싱하기
SimpleXML을 사용하면 XML 데이터를 쉽게 파싱할 수 있습니다.
PHP
이제 $xml 객체를 사용하여 XML 데이터에 접근할 수 있습니다. 예를 들어 XML에 <item><name>Sample Name</name></item> 구조가 있다면, 다음과 같이 파싱할 수 있습니다.
-
foreach ($xml->item as $item) {
echo $item->name;
}
PHP 예제코드
PHP
$xmlUrl = "https://example.com/sample.xml"; // 외부 XML 주소
$xmlData = file_get_contents($xmlUrl);
$xml = simplexml_load_string($xmlData);
foreach ($xml->item as $item) {
echo $item->name . "<br>";
}
❶ 외부 URL로부터 데이터를 가져올 때, allow_url_fopen 옵션이 php.ini에서 활성화되어 있어야 file_get_contents() 함수가 작동합니다.
❷ file_get_contents()가 작동하지 않거나 비효율적인 경우에는 cURL을 사용하여 데이터를 가져올 수 있습니다.
❸ 외부 데이터를 가져올 때 항상 안전을 위한 처리(예: XML의 유효성 검사)가 필요합니다.
공공데이타포털 XML포맷 예시
공공데이타 XML 파싱 예제
PHP
$ch = curl_init();
$url = 'http://apis.data.go.kr/1262000/SafetyNewsList/getCountrySafetyNewsList';
$queryParams = '?' . urlencode('ServiceKey') . '시디키값';
$queryParams .= '&' . urlencode('numOfRows') . '=' . urlencode('10');
$queryParams .= '&' . urlencode('pageNo') . '=' . urlencode('1');
/*
$queryParams .= '&' . urlencode('title1') . '=' . urlencode('입국');
$queryParams .= '&' . urlencode('title2') . '=' . urlencode('코로나');
$queryParams .= '&' . urlencode('title3') . '=' . urlencode('운항');
$queryParams .= '&' . urlencode('title4') . '=' . urlencode('항공권');
$queryParams .= '&' . urlencode('title5') . '=' . urlencode('격리');
*/
curl_setopt($ch, CURLOPT_URL, $url . $queryParams);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$response = curl_exec($ch);
curl_close($ch);
$xml = simplexml_load_string($response);
//echo $xml->body->items->item[0]->content;
for ($i=0;$i$xml->body->items->item);$i++) {
$title = $xml->body->items->item[$i]->title;
$content = $xml->body->items->item[$i]->content;
$content = nl2br($content);
?>
<ul>
<li><strong>=$title?>strong>li>
<li>=$content?>li>
ul>
}
?>
여기서는 curl 을 이용하여 GET 방식으로 처리했다.
simplexml_load_string 를 이용하면 간단히 처리할 수 있다.
아주 직관적이라 이해하기 어렵진 않을것 같다.