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