[php] simplexml_load_string 을 이용한 간단한 xml 파싱기

[php] simplexml_load_string 을 이용한 간단한 xml 파싱기 updated_at: 2023-03-16 02:44

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"])
평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글