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