프로그래밍/PHP

XPath로 웹에서 필요한 부분을 가져오자!

Code-Moon 2011. 1. 21. 00:02
XPath라는 것이 있습니다. 
W3C 표준으로써 XML문서의 노드를 정의하기 위하여 경로식을 사용하며, 수학 함수와 기타 확장 가능한 표현들이 있습니다.

무슨 말인지 모르겠죠?
그냥 간단히 말해서 XML 형식의 문서가 있으면, 그 중에 특정한 부분의 값을 가져오기 위한 방법이라고 생각하시면 될 것 같습니다.

예를들어 아래와 같은 XML 문서가 있다고 하겠습니다.

<?xml version="1.0" encoding="UTF-8"?>
<channel>
  <item>
    <id>donxu</id>
    <name>동수</name>
  </item>
  <item>
    <id>ehxm</id>
    <name>경호</name>
  </item>
  <item>
    <id>ange</id>
    <name>광휘</name>
  </item>
</channel>

여기에서 name에 접근하려면
//name
으로 접근할 수 있습니다.
물론, 이렇게 하면 3개의 name값을 다 가져오게 되죠.

자세한 문법은 아래의 링크를 참조하시죠.

XPath를 이용하면 특정 이름, 속성, 값을 갖는 태그에 접근이 가능합니다. 물론, 그러한 태그가 여러개가 있다면 그 중에 하나를 선택할 수도 있구요.

그렇다면 본격적으로 php에서 XPath를 사용하는 방법을 알아보도록 하죠.
일단, 저는 XPathManager클래스를 만들어서 사용합니다.

<?php
    Class XPathManager {
        private $url;
        private $dom;
        private $xPath;
        public function XPathManager($strUrl) {
            $this--->url = $strUrl;
            // 객체 생성
            $this->dom = new DOMDocument();
            $this->dom->loadHTMLFile($strUrl);
            $this->xPath = new DOMXPath($this->dom);
        }
        public function getObjectList($strQuery) {
            $result = $this->xPath->query($strQuery);
            return $result;
        }
    }
?>

이렇게 XPathManager클래스를 두고, 실제로 파싱을 하는 php문서에서 사용을 하면 됩니다.

그렇다면 바로 실전으로 들어가보죠.
여기에서는 http://donxu.tistory.com 의 메인 화면에 있는 recent post의 각 항목들을 출력해보도록 하겠습니다.



<?php
    include "XPathManager.php";
    $strUrl = "http://donxu.tistory.com";
    $xPathManager = new XPathManager($strUrl);
    $recentPosts = $xPathManager->getObjectList("//div[@id='recentPost']/ul/li/a");
        for($i = 0; $i < $recentPosts->length; $i++) {
        $value = $recentPosts->item($i)->nodeValue;
        echo "$value";
    }
?>
코드를 보시면 2번째 줄에서 XPathManager.php를 include하고 있고, 5번째 줄에서 XPathManager 객체를 만듭니다. 
이때에 http://donxu.tistory.com을 인자로 넣어주는 군요. 이렇게 함으로써 http://donxu.tistory.com페이지를 내부적으로 로드하게 됩니다.
7번째 줄을 보시면 xPathManager객체에서 getObjectList()함수를 사용합니다. 이 때에 인자로 XPath문법이 사용되는 군요.
//div[@id='recentPost']/ul/li/a 가 recent post의 각 항목에 해당하는 식입니다.
이러한 식을 구하는 방법은 다음에 알아보도록 하겠습니다.
9~12번째 줄은 이렇게 가져온 값들을 한줄씩 출력해주고 있습니다.

실제로 이 코드를 실행해보니 아래와 같은 결과가 나오는군요.


어때요?? 쉬우신가요??
이런식으로 모든 XML 문서뿐만 아니라, 웹페이지에서도 원하는 정보를 가져올 수 있습니다.^^

<참고 자료>