웹모아
웹모아[손님] 검색   로그인 / 회원가입    



 
토막소스
 


XML<-->Array 클래스
  2008-08-01 03:35:04 댓글:(4)   조회:1774



xml을 array로 -------------------------------------------

/**
 * @author ArtWorker
 * @copyright 20071216
 * 해당 Text값은 배열의 value라는 키 값으로 전환.
 */
class ToArray extends DOMDocument
{
    function ToArray($n)
    {
        $xml_array = array();
        foreach($n->childNodes as $nc){
                
            if($nc->hasChildNodes())
            {
                $xml_array[$nc->nodeName] = $this->ToArray($nc);
                
                if($nc->hasAttributes()){
                        $attributes = $nc->attributes;
                        foreach ($attributes as $index=>$attr){
                            $xml_array[$nc->nodeName][$attr->name] = $attr->value;
                        }
                }
            }
            else
            {
                $xml_array['value'] = $nc->nodeValue;
            }
        }
        return $xml_array;
    }
}



array를 xml로 -------------------------------------------


/**
 * @author ArtWorker
 * @copyright 20071216 ~ 23일 완성
 * XML파서에 대한 이해가 무지하다 보니 오래 걸렸다.
 * 특히 속성을 처리 하는 부분에서 많은 시간을 까먹었다.
 */

class ToXML extends DOMDocument {
       
        public $root;
        public $sub_root;
        public $sub_obj;
        public $sub_att;
        public $keys;
       
        /**
        * ToXML
        * @param array $array
        */

        function ToXML($array)
        {
            foreach($array as $key=>$val)
            {
                /**
                * 루트 노드를 생성
                * 현 foreach는 한번만 실행. 나머지는 release_node에서 재귀호출 한다.
                */
                $this->root=$this->createElement($key);
                $this->appendChild($this->root);
                $this->sub_root=$key;
                $this->keys[$this->sub_root] = $this->root;
                $this->release_node($val);
            }
        }
        
        function release_node($array)
        {
            foreach($array as $key=>$val)
            {
                if(is_array($val))
                {
                    /**
                    * 배열일 경우 현재위치 노드를 sub_root에 저장하고 엘리먼트를 생성한다.
                    * 재귀호출 하여 단계별로 하위 엘리먼트를 생성한다.
                    */
                    #배열일 경우
                    $root=$this->sub_root;
                    $this->sub_obj[$key] = $this->createElement($key);
                    $this->keys[$this->sub_root]->appendChild($this->sub_obj[$key]);
                    $this->sub_root = $key;
                    $this->keys[$this->sub_root]=$this->sub_obj[$key];
                    $this->release_node($val);
                    $this->sub_root = $root;
                }
                else
                {
                    /**
                    * 배열이 아닐 경우는 value(node값) 이거나 속성으로 판단한다.
                    * 이 밖에 다른 구문이 추가 되는 경우(isobject() 등),
                    * elseif로 추가 작성 한다.
                    * php.net의 코멘트에서 많은 영감을 받았다.
                    */
                    if($key == 'value')
                    {
                        #노드값일 경우
                        $this->keys[$this->sub_root]->appendChild($this->createTextNode($val));
                    }
                    else
                    {
                        /**
                        * 속성 처리 부분에서 참 많은 고민을 했고 많은 시간을 허비 했다.
                        * 재퀴 호출이기 때문에 root엘리먼트가 계속 바뀌므로,
                        * 기존의 엘리먼트를 유지하는 방법을 찾아 많은 시간을 보냈다.
                        */
                        #속성일 경우
                        $this->sub_att[$key]=$this->createAttribute($key);
                        $this->sub_att[$key]->value = $val;
                        $this->keys[$this->sub_root]->appendChild($this->sub_att[$key]);

                    }
                }
            }
        }

        /**
        * get the finished xml
        *
        * @return string
        */
}


/**
*    DOMDocument를 직접 상속 받으므로 기존 자원 사용 가능.    
*
*     #ToArray 사용법
*         $dom = new ToArray('1.0','utf-8');
*         $dom->load('sample.xml');
*         $array=$dom->ToArray($dom);
*
*     #ToXML 사용법
*         $dom = new ToXML('1.0','utf-8');
*         $dom->ToXML($array);
*         $dom->save('sample2.xml');
*/



 댓글 (4)


  •     2008-08-01 03:51:59
    function object2array($object)
    {
    $return = NULL;

    if(is_array($object))
    {
    foreach($object as $key => $value)
    $return[$key] = object2array($value);
    }
    else
    {
    $var = get_object_vars($object);

    if($var)
    {
    foreach($var as $key => $value)
    $return[$key] = ($key && !$value) ? NULL : object2array($value);
    }
    else return $object;
    }

    return $return;
    }
    ?>

  •     2008-08-01 03:50:37
    $xml = '



    <![CDATA[Tom & Jerry]]>


    ';

    $xml = simplexml_load_string($xml);

    // echo does the casting for you
    echo $xml->channel->item->title;

    // but vardump (or print_r) not!
    var_dump($xml->channel->item->title);

    // so cast the SimpleXML Element to 'string' solve this issue
    var_dump((string) $xml->channel->item->title);
    ?>

    Above will output:

    Tom & Jerry

    object(SimpleXMLElement)#4 (0) {}

    string(11) "Tom & Jerry"

  •     2008-08-01 03:46:55
    검색을 해보니. php 5 이상에서 되고;;
    phpinfo 에서 xml관련 설치하고;;
    content type=text/html/xml 로 해주고
    관련 변수에서

    $aaa=simplexml_load_file("a.xml");
    $aaa=simplexml_load_file(http://www.xxx.com/a.jsp);
    이런식으로 해주면 aaa에 저장이 되는거 같은데;ㅣ;

    그리고 xml에서 내용이....

    새로나온책1

    15000

    와 같다면

    foreach ($result->item as $item){
    echo $item->title;
    echo $item->description;
    echo $item->price;
    }
    이런식으로 각각의 항목을 출력

  •     2008-08-01 03:41:36
    $xmlDoc = simplexml_load_file($xmlResponse);
    이렇게 해서 simplxml 오브젝을 만든후에
    $titleName = $xmlDoc->item->title;
    이런식으로 하면 어쩌구 같은 밸류를 뽑아올수 있습니다.
  • 



토막소스
페이지: 1 / 4   


   이미지 사이즈 비율대로 축소1035
   PHP- 파일 다운로드시 속도 제한하기1796
     파일 다운로드 속도 제한1514
   ffmpeg 설치 후 php 업로드 간단 테스트2438
   새청없이 주소검색2089
   EUC-KR<=>UTF-8 상호변환 하기1997
   키를 이용한 암호화/복호화 함수입니다.1625
   간단한 암호화/복호화 함수1709
   PHP로 작동하는 RSS 읽는 함수1532
   [PHP] 자동 썸네일 이미지 만들기2143
   내용 검색시 검색어 내용 포함되어있는 부분 출력하기1500
   사이트 방문경로와 검색한 단어 알기1477
   이미지 실제경로를 않보여주고 이미지 출력하기(2) 4995
    Ajax로 구연한 실시간 서버시간 출력2363
   ajax refresh(2초에 한번 자동 페이지로딩5220
   refresh.php1496
   연합뉴스 샘플1637
   구글뉴스1467
   웹페이지의 문자열 가져오기 소스1718
XML<-->Array 클래스(4) 1775
   str_replace() 한글치환 보강1884
   php로 텍스트라인에서 영문 한글 특수문자 숫자 지2893
   추천 하려면..어떻게 해야하죠?(1) 1544
   들어온 경로 URL 기록 남기기1692
   중복 로그인 방지법4419
   세션 DB 처리 소스1612
   한페이지에서 체크된것은 Y, 아니면 N으로 업데이트(1) 1599
   [제로보드] 쪽지 도착하면 자동으로 뜨게 하기(홈마스타)1573
   PHP특강(28)-쪽지 확인창 띄워주기(홈마스타)1783
   [초보강좌] 세션을 DB로 관리하기 + 쪽지 확인하(홈마스타)792
[1]  [2]  [3]  [4]  

복수단어 검색은 공백(space)로 구분해 주세요. 1





최근 글
[손님]

인기 글
[손님]
[깊은연못] 24시간 Classical Radio
[홈마스타] setinterval 사용과 중지
[김준수] (1) 모의고사 풀이
[밝곰] 출첵입니다
[홈마스타] check박스 배열 넘기기