/**
* @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');
*/
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;
이런식으로 하면 어쩌구 같은 밸류를 뽑아올수 있습니다. ▷