phpldapadmin/lib/xml2array.php

146 lines
3.6 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 {
public $stack = array();
public $stack_ref;
public $arrOutput = array();
public $resParser;
public $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.
*
* @param $details
* @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;
}
}