<? 
/** 
* 轻量级xml文档生成类(非dom) 
* author: q3boy <q3boy@sina.com> 
* version: v0.1 aplha 
* update: 2003/9/8 
* 支持element/cdata/declare/attribute/comment，可选择是否包含换行和缩进 
*/ 
class xml { 

/** 元素名 */ 
var $name; 
/** 元素值 */ 
var $value; 
/** 元素类型 */ 
var $type; 
/** 元素属性 */ 
var $attrib; 
/** xml声明 */ 
var $declare; 
/** 是否缩进换行 */ 
var $space; 

/** 构造函数 */ 
function xml($name='',$value='') { 
$this->name = $name; 
$this->value = $value; 
$this->declare = array(); 
$this->settypes('element'); 
$this->setattrib(array()); 
$this->setspace(false); 
} 

/** 设置元素类型 */ 
function settypes($type) { 
$this->type = $type; 
} 

/** 设置是否缩进换行 */ 
function setspace($space) { 
$this->space = $space; 
} 

/** 设置元素属性 */ 
function setattrib($name,$value='') { 
if(is_array($name)) { 
$this->attrib = array_merge((array)$this->attrib,$name); 
}else { 
$this->attrib[$name] = $value; 
} 
} 

/** 添加子元素 */ 
function &addelement($name='',$value='') { 
if(!is_array($this->value)) { 
$this->value = array(); 
} 
$xml = new xml($name,$value); 
$xml->setspace($this->space); 
$this->value[] = &$xml; 
return $this->value[sizeof($this->value)-1]; 
} 

/** 添加cdata数据 */ 
function &addcdata($name='',$value='') { 
if(!is_array($this->value)) { 
$this->value = array(); 
} 
$xml = new xml($name,$value); 
$xml->setspace($this->space); 
$xml->settypes('cdata'); 
$this->value[] = &$xml; 
return $this->value[sizeof($this->value)-1]; 
} 

/** 添加xml声明 */ 
function &adddeclare($name='',$value='') { 
if(!is_array($this->declare)) { 
$this->value = array(); 
} 
$xml = new xml($name,$value); 
$xml->setspace($this->space); 
$xml->settypes('declare'); 
$this->declare[] = &$xml; 
return $this->declare[sizeof($this->value)-1]; 
} 

/** 添加注释文本 */ 
function &addcomment($content='') { 
if(!is_array($this->value)) { 
$this->value = array(); 
} 
$xml = new xml($content); 
$xml->setspace($this->space); 
$xml->settypes('comment'); 
$this->value[] = &$xml; 
return $this->value[sizeof($this->value)-1]; 
} 

/** 返回xml文本流 */ 
function tostring($itm='',$layer=0) { 
if(!is_object($itm))$itm = &$this; 
/* 换行/缩进 */ 
if($this->space) { 
$tab = str_repeat(" ",$layer); 
$tab1 = str_repeat(" ",$layer+1); 
$br = "\n"; 
} 
/* xml声明 */ 
for($i=0; $i<sizeof($itm->declare); $i++) { 
$out = "<?".$itm->declare[$i]->name; 
foreach($itm->declare[$i]->attrib as $key=>$val) { 
$out .=" $key=\"".$this->encode($val)."\""; 
} 
$out.="?>$br"; 
} 
/* 文档树 */ 
switch($itm->type) { 
case 'cdata': 
case 'element': 
$out .= $tab.'<'.$itm->name; 
foreach((array)$itm->attrib as $key=>$val) { 
$out .=" $key=\"".$this->encode($val)."\""; 
} 
if(is_array($itm->value)) { 
$out .='>'.$br; 
for($i=0; $i<sizeof($itm->value); $i++) { 
$out .=$this->tostring(&$itm->value[$i],$layer+1); 
} 
$out .= $tab.'</'.$itm->name.'>'.$br; 

}elseif($itm->value!='') { 
$out .='>'.$br.$this->encode($itm->value,$itm->type,$tab1,$br).$br.$tab.'</'.$itm->name.'>'.$br; 
}else { 
$out .=' />'.$br; 
} 
break; 
case 'comment': 
$out .= '<!--'.$br.$itm->name.$br.'-->'.$br; 
break; 
} 
return $out; 
} 

/** 生成xml文件 */ 
function tofile($file) { 
$fp = fopen($file,'w'); 
fwrite($fp,trim($this->tostring())); 
fclose($fp); 
} 

/** 实体引用转换 */ 
function encode($content,$type='element',$tab1='',$br='') { 
if($type=='element') { 
return $tab1.strtr($content,array('<'=>'&lt;','>'=>'&gt;','&'=>'&amp;','"'=>'&quot;',"'"=>'&apos;')); 
}elseif($type=='cdata') { 
return '<![CDATA['.$br.str_replace(']]>',']] >',$content).$br.']]>';
} 
} 
}
?>