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

<참고 자료>

저작자 표시
신고
Posted by Code-Moon
TAG DOM, php, xpath, , 파싱

댓글을 달아 주세요

php를 사용하다 보면 파일이나 웹 페이지를 그대로 출력해야할 때가 있습니다.

특히! 웹페이지의 링크를 얻어와서 그 페이지 자체를 출력해야할 필요가 있을 때 그렇죠!
그 때 사용하는 방법입니다.

<?php
    $result = file_get_contents("$url");
    echo $result;
?>

$url부분에 파일의 경우에는 파일 이름을, 웹 페이지의 경우에는 해당 url을 입력하면 됩니다.
저작자 표시
신고
Posted by Code-Moon

댓글을 달아 주세요

오늘 php에서 xml 형식을 출력하는데, 거의 2~3시간 고생했군요-_-;;
평소에는 잘 되던 거였는데,, 왜 안되는가 이유를 모르겠더군요..

2시간쯤 뻘짓해보고나서야 
<?xml version="1.0" encoding="UTF-8"?> 선언하기 전에 위쪽에 공백이 있으면 안된다는걸 알았고,

그래서 그 공백이 왜 생기나 의아해했습니다.

처음에는 네이버 블로그 api를 쓰는 작업이었는데,, api 자체에서 값을 넘겨줄 때 잘 못 넘겨주나 싶었는데,,
아무리 검색을 해봐도 그런 글은 찾아볼 수가 없더군요-_-;;

그래서 혹시 echo함수의 문제인가,,해서 또 찾아봤더니,, echo함수에도 그런 문제는 없더군요..

결국 원점으로 돌아가서 그냥 아무 글이나 echo로 출력해봤습니다.
그랬는데,, 이상하게 위에 두줄이 띄워지더군요;;;
그래서 php문서를 잘 살펴보니,,, 최초 <?php를 시작하기 전에 제가 엔터를 두번쳤더군요-_-;;
그래서 안되는 거였음..;;;

xml... 생각보다 까다롭군요.


한가지 참고할 것!
php에서 xml형식으로 만들어서 echo로 출력하면 보이기에는 xml 형식인 것 같지만, 뭔가 하나 빠진 것 같습니다.
아직 정확히는 모르겠는데, 자바스크립트에서 해당 페이지를 읽어서 바로 dom객체로 인식이 안되더군요-_-
그런데, php 문서에서 xml을 출력하기 전에 
header("Content-type: text/xml");
를 호출해주면 자바스크립트에서 이 문서를 dom객체로 바로 인식하네요.

뭔가 확실하게는 모르겠지만, xml을 출력할 때에는 header()함수를 호출해주는 것이 좋을 듯 합니다.
저작자 표시
신고
Posted by Code-Moon

댓글을 달아 주세요

웹에서 정보를 긁어올 때가 있습니다.

저는 정규표현식이 아닌 xpath를 이용하여 필요한 정보를 파싱해서 가져옵니다.
제 생각에는 정규표현식을 사용하는 것보다 이게 더 적절한 방식인 것 같습니다.


php에서 xpath를 이용하려면 dom객체를 생성하여 html파일을 로드해야하는데요, 이 때 로드할 파일을 넣거나 url을 입력합니다. 
get방식으로 정보를 전송하는 페이지의 경우에는 url에 필요한 정보를 다 넣을 수 있어서 문제가 없지만, post방식은 url로 원하는 페이지를 요청할 수 없죠.

그렇기 때문에 중간(중개) 페이지가 하나 필요합니다.
이 중간 페이지는 최종적으로 원하는 페이지를 로드하기 위해 post로 정보를 전송하고, 요청된 페이지를 출력해주는 역할을 합니다. 
그래서 중간 페이지를 주소창에 입력하면, 우리가 원하는 최종 페이지를 볼 수 있어야하겠죠?



이러한 중간 파일을 만들 때 들어가야할 코드입니다.



$postdata = http_build_query(
    array(
        'var1' => 'some content',
        'var2' => 'doh'
    )
);

$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);

$context  = stream_context_create($opts);

$result = file_get_contents('http://post.php', false, $context);
echo $result;
저작자 표시
신고
Posted by Code-Moon

댓글을 달아 주세요

이번에 DB텀 프로젝트로 게시판을 만들게 되었다.

개발은 동아리 서버에 putty로 접속해서 하게 되었고, 개발 도중 확인하는 브라우저로는 firefox를 사용했다.

아무 문제없이 개발을 진행하고 있었는데, 우연한 기회에 IE에서 테스트를 하게 됐는데 화면에 아무 것도 나오지 않는 것이었다.!!!!

아무리 문제를 찾아봐도 찾을 수가 없었는데, 결국 html vaildator 사이트에서 검사를 해본 결과 수 많은 에러가 발생했고 그 중에 몇 개를 고쳐주자 잘 실행되었다.

그 전에도 validator가 있다는 것은 알고 있었지만 절대! 안써도 될 툴이라고 생각하고 있었는데, 이번 일을 계기로 삼아 이 툴이 얼마나 좋은지 알게되었다.ㅠ_ㅠ

 

Vaildator 사이트 : http://validator.w3.org/

신고
Posted by Code-Moon

댓글을 달아 주세요

  1. BlogIcon pooha302 2010.03.11 17:13 신고 Address Modify/Delete Reply

    Firefox로 테스트 하면
    부가기능으로
    Web Developer : css 및 javascript오류 추적, 각종 웹개발 관련 기능
    firebug : javascript를 visual studio의 디버깅 기능처럼 브레이크 포인트 잡고 한 스텝씩 테스트 가능.
    두개 추천.

    요새 크롬이나 IE 최신버전에는 개발자를 위해서 javascript 디버깅 툴이 달려 있는거 같던데 ㅎㅎ

이번에 DB텀을 하면서 우리 동아리(untoC) 서버에서 작업을 하게 됐다.
왜냐하면 기본적인 서버 환경이 다 갖추어져 있기 때문이었다. Php, mysql, apache, …등이 다 설치가 되어 있기 때문에 그냥 쓰기만 하면 되는 상황이었다.
그래서 자연스럽게 php파일을 만들었는데 이게 무슨 일???!!!

한글이 깨지는 것이었다!!!!

 

처음에는 서버의 환경 설정 문제일 거라 생각했다. 구글링을 하면서 엄청나게 찾아 헤맸지만 절대 답을 찾을 수 없었다.

구글링을 통해 알아낸 몇가지 사실은 다음과 같다.

이렇게 한글이 깨지는 문제는 character set의 설정 문제인데 이는 php, mysql, apache에서 각각 설정을 다 해줘야 하는 부분이었다.

 

  • 먼저 php설정은 etc폴더에 있는 php.ini 파일.
    php.ini파일에서 수정해야 하거나 추가해야 하는 부분은 아래와 같다.

default_charset = "UTF-8"

mbstring.language = UTF-8

mbstring.internal_encoding = UTF-8

mbstring.http_input = auto

mbstring.http_output = UTF-8

mbstring.encoding_translation = On

mbstring.detect_order = auto

mbstring.substitute_character = none;

 

  • Mysql설정은 etc폴더에 있는 my.cnf 파일
    my.cnf파일에서 수정해야 하거나 추가해야 하는 부분은 아래와 같다.

[mysqlId]부분

default-character-set = utf8

 

[client] 부분

character-set = utf8

 

  • Apache설정은 etc/httpd/conf폴더에 있는 httpd.conf 파일
    httpd.conf파일에서 수정해야 하거나 추가해야 하는 부분은 아래와 같다.
    AddDefaultCharset의 경우에는 어떤 웹에서는 UTF-8로 설정해야 한다고 하고, 또 다른 사이트에서는 추가하면 화면이 깨질 수 있다고 하니 주의하자.

AddDefaultCharset UTF-8

 

  • etc/sysconfig 폴더에 있는 i18n 파일
    i18n파일에서 수정해야 하거나 추가해야 하는 부분은 아래와 같다.

LANG="ko_KR.UTF-8"
SUPPORTED="ko_KR.UTF-8:ko_KR:ko"

export LANG="ko_KR.UTF-8"

 

  • html 또는 php파일(웹 페이지 파일)
    우리가 웹에 보여주고 싶은 페이지에는 <head>태그 사이에 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>이라고 적어줘야 한다.

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

</head>

 

그런데 위의 과정들을 아무리 보고 수정해보아도 도저히 바뀌는 건 없었다. 여전히 한글 대신에 이상한 말들만 떠 있었다.
그래서 고심 끝에 내린 결론!!

 

내가 생성한 파일 자체가 UTF-8이 아닌 다른 것으로 인코딩 되어있다!!!

 

그래서 리눅스에서 인코딩 설정을 어떻게 하는지가 중요하게 되었는데, 답은 의외로 간단했다.



  1. 일단은 위 그림과 같이 putty 설정을 보면 <창 – 변환>에서 수신한 데이터를 이 문자셋으로 가정 부분에 UTF-8로 해준다.

    이렇게 하고 나면 putty에서 UTF-8로 디코딩하는 것 같아보였다. 그래서 기존에 작성했던 파일의 한글 부분을 보면 아래 그림과 같이 이상한 문자로 장식된다.
    바로 아래 그림의 흰 사각형 안쪽 부분에 있는 글들이 원래는 한글로 된 글자였는데, 지금은 저렇게 알아볼 수 없게 표시되는 것이다.


    이 파일을 실제로 웹 브라우저를 통해서 보면 아래와 같은 참혹한 결과를 볼 수 있을 것이다.



    그래서 우리가 해야할 일은,,

     

     

  2. 기존의 한글 부분을 다시 채워넣는 것이다.

    이렇게 깨진 부분을 다시 제대로 된 한글도 채워 넣으면 이제는 UTF-8형식을 따르게 되는 것이다.


    이렇게 바꾸고 나서 저장을 하고 다시 웹 브라우저를 통해서 보면 다음 그림과 같이 아주 멋지게 한글이 잘 나옴을 알 수 있다.


    Mission Success!!
신고
Posted by Code-Moon

댓글을 달아 주세요

  1. BlogIcon pooha302 2010.03.11 17:14 신고 Address Modify/Delete Reply

    shell 작업은 왠만하면 putty는 비추..
    http://netsarang.co.kr
    XShell 추천 ㅋㅋ

  2. BlogIcon 이선호 2013.03.29 13:20 신고 Address Modify/Delete Reply

    무지무지 감사해요!

티스토리 툴바