본문 바로가기

프로그래밍/PHP

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

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 문서뿐만 아니라, 웹페이지에서도 원하는 정보를 가져올 수 있습니다.^^

<참고 자료>