145 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
		
		
			
		
	
	
			145 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
|  | <?php | ||
|  | /** | ||
|  |  * Classes and functions for manipulating XML templates. | ||
|  |  * | ||
|  |  * @author The phpLDAPadmin development team | ||
|  |  * @package phpLDAPadmin | ||
|  |  */ | ||
|  | 
 | ||
|  | /** | ||
|  |  * XML Parser | ||
|  |  * | ||
|  |  * This will read our XML file and convert it into variables for us to parse. | ||
|  |  * | ||
|  |  * @package phpLDAPadmin | ||
|  |  * @subpackage XML | ||
|  |  */ | ||
|  | class xml2array { | ||
|  | 	var $stack = array(); | ||
|  | 	var $stack_ref; | ||
|  | 	var $arrOutput = array(); | ||
|  | 	var $resParser; | ||
|  | 	var $strXmlData; | ||
|  | 
 | ||
|  | 	private function push_pos(&$pos) { | ||
|  | 		$this->stack[count($this->stack)] = &$pos; | ||
|  | 		$this->stack_ref = &$pos; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private function pop_pos() { | ||
|  | 		unset($this->stack[count($this->stack) - 1]); | ||
|  | 		$this->stack_ref = &$this->stack[count($this->stack) - 1]; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function parseXML($strInputXML,$filename) { | ||
|  | 		$this->resParser = xml_parser_create(); | ||
|  | 		xml_set_object($this->resParser,$this); | ||
|  | 		xml_set_element_handler($this->resParser,'tagOpen','tagClosed'); | ||
|  | 
 | ||
|  | 		xml_set_character_data_handler($this->resParser,'tagData'); | ||
|  | 
 | ||
|  | 		$this->push_pos($this->arrOutput); | ||
|  | 
 | ||
|  | 		$this->strXmlData = xml_parse($this->resParser,$strInputXML); | ||
|  | 
 | ||
|  | 		if (! $this->strXmlData) | ||
|  | 			die(sprintf('XML error: %s at line %d in file %s', | ||
|  | 				xml_error_string(xml_get_error_code($this->resParser)), | ||
|  | 				xml_get_current_line_number($this->resParser), | ||
|  | 				$filename)); | ||
|  | 
 | ||
|  | 		xml_parser_free($this->resParser); | ||
|  | 
 | ||
|  | 		$output = array(); | ||
|  | 		foreach ($this->arrOutput as $key => $values) | ||
|  | 			$output[$key] = $this->cleanXML($values); | ||
|  | 
 | ||
|  | 		#return $this->arrOutput;
 | ||
|  | 		return $output; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private function tagOpen($parser,$name,$attrs) { | ||
|  | 		$name = strtolower($name); | ||
|  | 
 | ||
|  | 		if (isset($this->stack_ref[$name])) { | ||
|  | 			if (! isset($this->stack_ref[$name][0])) { | ||
|  | 				$tmp = $this->stack_ref[$name]; | ||
|  | 				unset($this->stack_ref[$name]); | ||
|  | 				$this->stack_ref[$name][0] = $tmp; | ||
|  | 			} | ||
|  | 
 | ||
|  | 			$cnt = count($this->stack_ref[$name]); | ||
|  | 			$this->stack_ref[$name][$cnt] = array(); | ||
|  | 			if (isset($attrs)) | ||
|  | 				$this->stack_ref[$name][$cnt] = $attrs; | ||
|  | 
 | ||
|  | 			$this->push_pos($this->stack_ref[$name][$cnt]); | ||
|  | 
 | ||
|  | 		} else { | ||
|  | 			$this->stack_ref[$name]=array(); | ||
|  | 
 | ||
|  | 			if (isset($attrs)) | ||
|  | 				$this->stack_ref[$name]=$attrs; | ||
|  | 
 | ||
|  | 			$this->push_pos($this->stack_ref[$name]); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private function tagData($parser,$tagData) { | ||
|  | 		if (trim($tagData) != '') { | ||
|  | 
 | ||
|  | 			if (isset($this->stack_ref['#text'])) | ||
|  | 				$this->stack_ref['#text'] .= $tagData; | ||
|  | 			else | ||
|  | 				$this->stack_ref['#text'] = $tagData; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private function tagClosed($parser,$name) { | ||
|  | 		$this->pop_pos(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * This function will parse an XML array and make a normal array. | ||
|  | 	 * | ||
|  | 	 * @return array - Clean XML data | ||
|  | 	 */ | ||
|  | 	private function cleanXML($details) { | ||
|  | 		# Quick processing for the final branch of the XML array.
 | ||
|  | 		if (is_array($details) && isset($details['#text'])) | ||
|  | 			return $details['#text']; | ||
|  | 
 | ||
|  | 		elseif (is_array($details) && isset($details['ID']) && count($details) == 1) | ||
|  | 			return $details['ID']; | ||
|  | 
 | ||
|  | 		$cleanXML = array(); | ||
|  | 
 | ||
|  | 		# Quick processing for the final branch, when it holds the ID and values.
 | ||
|  | 		if (is_array($details) && isset($details['ID']) && count($details) > 1) { | ||
|  | 				$key = $details['ID']; | ||
|  | 				unset($details['ID']); | ||
|  | 				$cleanXML[$key] = $this->cleanXML($details); | ||
|  | 				$details = array(); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		# More detailed processing...
 | ||
|  | 		if (is_array($details)) | ||
|  | 			foreach ($details as $key => $values) | ||
|  | 				if (is_numeric($key) && isset($values['ID']) && count($values) > 1) { | ||
|  | 					$key = $values['ID']; | ||
|  | 					unset($values['ID']); | ||
|  | 					$cleanXML[$key] = $this->cleanXML($values); | ||
|  | 
 | ||
|  | 				} elseif (isset($values['#text'])) | ||
|  | 					$cleanXML[$key] = $this->cleanXML($values); | ||
|  | 
 | ||
|  | 				elseif (is_array($values)) | ||
|  | 					$cleanXML[$key] = $this->cleanXML($values); | ||
|  | 
 | ||
|  | 		if (! $cleanXML) | ||
|  | 			return $details; | ||
|  | 		else | ||
|  | 			return $cleanXML; | ||
|  | 	} | ||
|  | } |