/"; preg_match($patt,$xml,$matches); $xml_specs = explode(' ',$matches[1]); foreach($xml_specs as $spec) { if(empty($spec)) { continue; } list($name,$value) = explode('=',$spec); $value = str_replace("'",'',$value); $value = str_replace('"','',$value); $data[$name] = $value; } $xml = substr($xml,strlen($matches[0])); $xml_left = array($xml); // init xml heap $tmp_refs[] =& $data; // init refs heap $patt = "/^<(\w+)([^>]*)>/"; // pattern to get element at beginning of xml_left while(!empty($xml_left)) { $to_process = array_pop($xml_left); // $xml_left is a heap $to_process = trim($to_process); // trim fore and aft spaces $last_index = count($tmp_refs) - 1; if(preg_match($patt,$to_process,$matches)) { $element = $matches[1]; $parameters = isset($matches[2]) ? $matches[2] : ''; if(isset($tmp_refs[$last_index][$element])) { if(is_array($tmp_refs[$last_index][$element])) { if(isset($tmp_refs[$last_index][$element][0])) { // case: [biography]=>[0],[1]...[x]; $element = biography array_push($tmp_refs[$last_index][$element],''); // endsup: [biography]=>[0],[1]...[x+1] $tmp_index = count($tmp_refs[$last_index][$element]) - 1; $tmp_refs[] =& $tmp_refs[$last_index][$element][$tmp_index]; } else { // case: [biography]=>[paragraph]; $element = biography $tmp_ary = $tmp_refs[$last_index][$element]; // endsup: [biography]=>[0]=>[paragraph] $tmp_refs[$last_index][$element] = array($tmp_ary,''); // [1]=>'' $tmp_refs[] =& $tmp_refs[$last_index][$element][1]; } } else { // case: [biography]=>"string"; $element = biography $tmp_refs[$last_index][$element] = array($tmp_refs[$last_index][$element],''); $tmp_refs[] =& $tmp_refs[$last_index][$element][1]; // endsup: [biography]=>[0]=>"string" } // [1]=>'' } else { $tmp_refs[$last_index][$element] = ''; // case: [biography]=> NULL; $element = biography $tmp_refs[] =& $tmp_refs[$last_index][$element]; // endsup: [biography]=>"" } if(!empty($parameters)) { // if there are parameters, add them as if they were imbedded elements $pairs = explode(' ',$parameters); $last_index = count($tmp_refs) - 1; $tmp_refs[$last_index] = array(); // we can do this, because we know the last element added // is always fresh and new foreach($pairs as $pair) { if(empty($pair)) { continue; } list($name,$value) = explode('=',$pair); $value = str_replace("'",'',$value); $value = str_replace('"','',$value); $tmp_refs[$last_index][$name] = $value; } } $end_tag = strpos($to_process,""); if($end_tag === FALSE) { return("ERROR IN XML DOCUMENT, NO END TAG: $element\n\nto process: $to_process"); } $element_len = strlen($matches[0]); $contents = substr($to_process,$element_len,$end_tag - $element_len); if($extra = substr($to_process,$end_tag + strlen(""))) { array_push($xml_left,$extra); } else { array_push($xml_left,'!~~END~~!'); } array_push($xml_left,$contents); } else if($to_process != '!~~END~~!') { // no pattern match, but it's not the end of an embedded element $tmp_refs[$last_index] = $to_process; // so we must have content to assign, so assign it--genius! array_pop($tmp_refs); } else { // we've reached the end of an embedded element, so jump back a level $tmp = array_pop($tmp_refs); } } return($data); } ########################################################################################## xml_force_array # parameters: path to file to parse # returns: associative array of xml file data function xml_force_array($element) { $array = array(); if(is_array($element)) { if(isset($element[0])) { $array = $element; } else { array_push($array,$element); } } else { array_push($array,$element); } return($array); } ?>