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;
 | |
| 	}
 | |
| }
 |