반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

PHP와 XSL 로 XML 변환하기

2012. 12. 21. 05:31 | Posted by 솔웅


반응형
How to parse XML with PHP5




Feeds 는 content 의 stream 으로 사람들이 웹사이트를 통해 정보의 조각들을 공유하기 위해 만든 것입니다. PHP5의 simpleXML 함수는 이 feed를 웹페이지에서 사용하기 편하도록 interpret 하는 방법을 아주 간단하게 구현할 수 있도록 도와 줍니다.


저는 최근 저희의 라디오 방송국 playlist 에서 제공하는 노래에 대한 live feed를 display 하는 widget 과 관련해서 작업을 했었습니다. radio 방송국에서 운영하는 시스템에서는 XML을 제공하는데요 이 자료들은 데이터베이스에서 나옵니다. 프로그램은 그 데이터를 feed로 만들어서 제공합니다.






서로 다른 서버끼리 데이터를 공유하기 위해 XML 을 사용하는 것은 일반적인 방법입니다. playlist 를 generate 하는 시스템은 proprietary 입니다. XML은 어떤 데이터가 공유될 수 있도록 하는 easy format 을 제공합니다.


XML 은 뭘까요?


XML 은 eXtensible Markup Language 의 줄임말로 site들 사이에서 공유하기 위해 데이터를 structure 하는 방법입니다. RSS (Real Simple Syndication) 와 Podcasts 같은 기술들도 XML 의 특별한 형태입니다. XML이 좋은 점은 여러분이 필요로 하는것을 여러분이 원하는 대로 표현할 수 있다는 겁니다.



XML은 쉽게 생성할 수 있습니다. 왜냐하면 HTML 이랑 아주 비슷하거든요. HTML 과 다른 점은 여러분만의 tag 를 따로 만들 수 있다는 겁니다. 예를 들어 여러분의 라디오 방송국에서 틀어줄 노래들의 list 에 대한 feed 를 put 한다고 가정합시다. 그러기 위해서 할 일은 당지 artist 이름, 노래 제목, 노래가 방송된 시긴 등을 encode 합니다. 이와 관련된 tag들을 만들 겁니다. <title> <artist> 그리고 이것들은 <song> tag 가 감쌀 겁니다. 또 우리는 각 노래가 방송된 시간을 표시할 건데요. 날짜와 시간이 여기에 들어갈 겁니다.

여러분은 이것을 아래 처럼 encode 할 수 있을 겁니다.


<songs>
    <song dateplayed="2011-07-24 19:40:26">
        <title>I left my heart on Europa</title>
        <artist>Ship of Nomads</artist>
    </song>
    <song dateplayed="2011-07-24 19:27:42">
        <title>Oh Ganymede</title>
        <artist>Beefachanga</artist>
    </song>
    <song dateplayed="2011-07-24 19:23:50">
        <title>Kallichore</title>
        <artist>Jewitt K. Sheppard</artist>
    </song>
</songs>



여기서 XML 데이터를 만들 때 지켜야 될 몇가지 규칙이 있습니다. 만약 XHTML 에 대해 잘 아신다면 쉽게 이해가 가실겁니다. 한번 볼까요?

   *  XML is case sensitive so <Title>` is not the same as <title>.
   *  All XML elements must have closing tags.
   *  XML requires a root element (the <songs> tag above serves as our root element)
   *  Attributes must be quoted
   *  Special characters (like & (&amp;) and < (&lt;) and > (&gt;) signs) must be encoded.

XML 은 HTML 보다 좀 더 strict 합니다. 하지만 정말 만들고 다루기가 쉽습니다.




Introducing simpleXML



simpleXML 을 사용해서 XML을 아주 쉽게 읽어서 그 내용에 접근할 수 있습니다.

위에 있는 XML 을 songs.xml 로 저장했다고 칩시다. 같은 폴더에 php 파일을 만들 겁니다.

이 전체 XML 을 아래 코드를 사용해서 읽을 겁니다.


<?php
    $mysongs = simplexml_load_file('songs.xml');
?>



이렇게 하면 다 읽은 겁니다. 저 xml 파일이 웹상의 어딘가에 있어도 그 URL 만 가지고 이렇게 읽을 수 있습니다. xml 파일이 여러분 서버에 있을 필요도 없는 거죠.

이제 우리는 이 파일의 내용을 담은 object (객체)를 가지게 됐습니다.

이 song 객체는 $mysongs 라는 변수에 담겨져 있습니다. 만약에 첫번째 artist 의 이름을 출력하고 싶다면 이렇게 하시면 됩니다.


<?php
    $mysongs = simplexml_load_file('songs.xml');
    echo $mysongs->song[0]->artist;
?>






이 객체의 일부분으로 XML tag 들이 매핑돼 있다는 걸 기억하세요. 그래서 그 name 을 통해 어느 element 이든 우리가 얻어 낼 수 있는 겁니다. 그리고 PHP 에서는 배열이 0번부터 시작한다는 것도 기억하시구요. 그래서 배열의 0번째 title을 위와 같이 출력한 겁니다.

자 이제 3번째 노래 제목을 출력해 볼까요?


<?php
    $mysongs = simplexml_load_file('songs.xml');
    echo $mysongs->song[2]->title;
?>





Working with Attributes



date 들을 얻으려면 그 attribute들에 어떻게 접근해야 되는지 알아야 됩니다. 이 notation은 tag 랑은 약간 다릅니다. 하지만 사용하는 건 똑 같이 쉽습니다.
바로 아래 처럼 사용하시면 됩니다.

<?php
    $mysongs = simplexml_load_file('songs.xml');
    echo $mysongs->song[1]['dateplayed'];
?>




Making a list of songs


So now that we’ve got the basics of accessing elements, let’s write the code to make a complete list of our songs parsed by interpreting our XML file.

이제 우리는 element들에 어떻게 접근하는지 그 기본을 알게 됐습니다.

이제 이 XML 파일을 interpret 함으로서 전체 노래를 parse 하도록 하겠습니다.


<?php
    $mysongs = simplexml_load_file('songs.xml');
    echo "<ul id="songlist">n";
    foreach ($mysongs as $songinfo):
        $title=$songinfo->title;
        $artist=$songinfo->artist;
        $date=$songinfo['dateplayed'];
        echo "<li><div class="title">",$title,"</div><div class="artist">by ",$artist,"</div><time>",$date,"</time></li>n";
    endforeach;
    echo "</ul>";
?>



각각의 노래들에 대해 접근하기 위해 우리는 foreach statement 를 사용했습니다. 그리고 그 정보를 간단한 HTML list 로 parsing 했습니다. 여러분은 이것을 일반적인 HTML 문서로 사용하시거나 아니면 노래 리스트를 출력하는 widget 으로 사용하실 수 있습니다.





Parsing a Flickr feed from a set


온라인에는 여러분이 parse 할만한 수 많은 XML feed 들이 있습니다. 예를 들어 Flickr 로부터 feed를 받을 수 있죠. 만약 여러분이 Flickr 를 update 하면 이 widget 은 자동적으로 이것을 여러분 웹싸이트에 display 할 겁니다.

예제로 사용하기 위해 약간의 고양이 사진들을 준비했습니다.
이 feed 에 대한 XML 을 얻으려면 Flickr 내의 웹 페이지로 가야 합니다. 그리고 화면 왼쪽 아래에 있는 XML icon 을 보세요.





우선 이 XML 의 구조를 알기 위해 이것을 분석해야 합니다. 이 feed 링크에서 오른쪽 마우스를 클릭해서 여러분의 하드 드라이브에 저장해 보세요. 그리고 이것을 photoset.xml 이라고 이름 짓고 브라우저로 열어 보세요.







저는 Safari 로 이 XML 파일을 열었습니다. 이 구조를 한번 살펴 보죠. 각각의 photo 들은 <entry> tag 안에 있죠? 그 안에 두개의 <link> tag 가 있네요. 첫번째 것은 Flickr 상의 이미지 링크이고 두번째 것은 이 이미지의 medium size 버전에 대한 링크가 있습니다.



위 예제를 살짝 바꿔보죠. 그리고 이 이미지들에 대한 thumbnail 을 표시하기 위해 두번째 link 를 살짝 조절하겠습니다. 이 작업을 하기 전에 Flickr 로 돌아가서 그 XML 파일의 경로를 얻으세요. 그리고 아래와 같이 코딩해 보세요.



<?php
    $mypix = simplexml_load_file('http://api.flickr.com/services/feeds/photoset.gne?set=72157627229375826&nsid=73845487@N00&lang=en-us');
    foreach ($mypix->entry as $pixinfo):
        $title=$pixinfo->title;
        $link=$pixinfo->link['href'];
        $image=str_replace("_b.jpg","_s.jpg",$pixinfo->link[1]['href']);
        echo "<a href="",$link,""><img src="",$image,"" alt="",$title,"" /></a>n";
    endforeach;
?>



<img> tag 의 alt text 로 <title> tag 를 사용할 겁니다. 그리고 anchor tag 의 href attribute 로 첫번째 <link> tag 를 사용할 거구요. 두번째 link 는 약간의 트릭을 사용했습니다. 두번째 링크의 href attribute ($pixinfo->link[1]['href']) 를 얻기 위해 array notation 을 사용할 수 있습니다. 그렇게 해서 우리가 필요한 큰 이미지를 얻게 될 겁니다. 이미지 이름을 바꾸기 위해서 str_replace 함수를 사용할 겁니다. 그러면 아래와 같은 thumbnail 을 얻게 될 겁니다.



Conclusion


simpleXML 은 정말 쉬워서 이것을 이용하면  Flickr 예제 같은 복잡한 feed를 parse 하는 것이 재밌을 겁니다. <entry> tag 안의 <link> tag 의 두번째 instance를 얻는데 아무런 문제가 없었던 점을 기억하세요. 이 작업은 이전 버전의 PHP 에서는 구현하기가 매우 어려웠을 겁니다. simpleXML 에는 다른 많은 기능들이 있습니다. 더 자세한 내용은 PHP manual을 보세요.
객체지향적인 접근에 관심이 있다면 PHP5 가 제공하는 SimpleXMLElement class도 도움이 될 겁니다.







반응형