[php] simplexml_load_string 을 이용한 간단한 xml 파싱기
simplexml_load_string 을 이용한 간단한 xml 파싱기
일반적인 xml을 간단하게 배열로 가져오기 위해 사용하는 기능이 simplexml_load_string 이다.
아래의 간단한 예를 보자
xml 파일예
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>블로그 타이틀</title>
<link>블로그 링크</link>
<description>블로그 설명</description>
<language>ko</language>
<pubDate>Tue, 16 Mar 2010 05:38:39 GMT</pubDate>
<generator></generator>
<image>
<url></url>
</image>
<item>
<title><![CDATA[#### 타이틀 파트 ]]> </title>
<link></link>
<guid></guid>
<description>
<![CDATA[#### 내용파트 ]]>
</description>
<pubDate>Tue, 16 Mar 2010 01:56:02 GMT</pubDate>
<dc:creator>#### 작성자파트</dc:creator>
</item>
<item>
...................................................
</item>
</channel>
</rss>
1. rss url로 부터 xml을 가져온다.
$xml = get_xml($rss_url);
2. 필요한 정보를 xml로 부터 가져온다.
최상위의 것은 아래와 같이 바로 접근하여 가져온다.
$title = (String)$xml->channel->title);
$link = (String)$xml->channel->link);
3. 하위 item으로 부터 각각의 정보를 가져온다.
$subtitle = $xml->channel->item[0]->title;
// 실제적으로 하위는 $xml->channel->item을 배열로 하여 가져온다.
foreach((Array)$xml->channel->item as $key => $val){
$subtitle[$key] = $xml->channel->item[$key]->title;
....................................................
}
function get_xml($url) {
$xml_contents = @file_get_contents($url);
$xml = @simplexml_load_string($xml_contents);
return $xml;
}
상기와 같이 모든 것이 마무리 되었습니다.
이런 정보는 웹을 조금 검색하다 보면 쉽게 얻을 수 있습니다.
그러나 오늘 이글을 쓰는 진짜 이유는 아래때문입니다.
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
일반적으로 xmlns:dc="http://purl.org/dc/elements/1.1/" 것이 없이 보통 rss 는 정의됩니다. 아래와 같이..
<rss version="2.0" >
...........................
</rss>
그러나 오늘 여기서는 xmlns:dc 라는 것과 xml 내용중에 보면 dc:creator 라는 것 때문에 별도로 글을 씁니다.
이처럼 다른 네임스페이스를 사용하는 경우 별도의 내임스페이스를 정의하여 사용하여야 합니다.
아래는 그러한 내용을 기술하였습니다.
네임스페이스 정의
$ns = [
"content" => "http://purl.org/rss/1.0/modules/content/",
"wfw" => "http://wellformedweb.org/CommentAPI/",
"dc" => "http://purl.org/dc/elements/1.1/"
];
상기와 동일한 플로우 진행
$xml = get_xml($rss_url);
$title = (String)$xml->channel->title;
$link = (String)$xml->channel->link;
$subtitle = $xml->channel->item[0]->title;
아래처럼 정의하여 값을 가져오면됩니다.
$creator = (String)$xml->channel->item[0]->children($ns["dc"])