<?php 
/** 
* 解析XML类 
* 
*/ 
class xmlParser{

	var $params = array();
	
	/** 
	* 读取XML文件 
	* 
	* @param unknown_type $file 
	*/ 
	function xmlOpen($file){
		$fp = @fopen($file, "r"); 
		if (!$fp) die("不能打开数据源"); 
		//读取文件 
		$this->data = fread($fp, filesize($file)); 
		fclose($fp); 
		$this->xmlToArray(); 
	}
	
	/** 
	* 把XML数据放入变量中 
	* 
	* @param unknown_type $data 
	*/ 
	function xmlData($d){
		$this->data = $d; 
		$this->xmlToArray(); 
	}
	
	/** 
	* 把变量中数据导成数组 
	* 
	* @return unknown 
	*/ 
	function xmlToArray(){
		$level = array(); 
		$xml_parser = xml_parser_create(); 

		// 将xml文件读入数组 
		xml_parse_into_struct($xml_parser, $this->data, $vals, $index); 
		xml_parser_free($xml_parser); 

		foreach ($vals as $xml_elem){ 
			// 元素结点展开 
			if ($xml_elem['type'] == 'open'){
				if (array_key_exists('attributes',$xml_elem)){ 
					list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']); 
				}else{ 
					$level[$xml_elem['level']] = $xml_elem['tag']; 
				} 
			}
			
			if ($xml_elem['type'] == 'complete'){
				$start_level = 1; 
				$php_stmt = '$this->params'; 
				while($start_level < $xml_elem['level']){ 
					$php_stmt .= '[$level['.$start_level.']]'; 
					$start_level++; 
				} 
				$php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];'; 
				eval($php_stmt); 
			} 
		}
		
		return $this->params; 
	} 
	//----------------------------------------------------------------------------- 
} 
?>
