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