[Easymod-cvs] easymod2/dev xml_to_array.php,NONE,1.1
Status: Beta
Brought to you by:
wgeric
From: Brendan K. <bk...@us...> - 2005-05-30 20:19:21
|
Update of /cvsroot/easymod/easymod2/dev In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7887/dev Added Files: xml_to_array.php Log Message: Some XML to Array parsing code. One method is using a function, another, better method (IMO), is a class based approach using php xml functions. --- NEW FILE: xml_to_array.php --- <?php // // XML to Array // // get XML $XML_string = implode('', file('mod_template.xml')); /* // parse to array $results = XMLtoArray($XML); */ // parse to array $XML = new XMLtoArray(); $XML_array = $XML->parse($XML_string); // show array echo '<pre>'; var_dump($XML_array); echo '</pre>'; /* function XMLtoArray($XML) { $XML = str_replace('<', '<![CDATA[<]]>', $XML); $XML = str_replace('>', '<![CDATA[>]]>', $XML); $xml_parser = xml_parser_create(); xml_parse_into_struct($xml_parser, $XML, $vals); xml_parser_free($xml_parser); $_tmp = ''; foreach ($vals as $xml_elem) { $x_tag = $xml_elem['tag']; $x_level = $xml_elem['level']; $x_type = $xml_elem['type']; if(($x_level != 1) && ($x_type == 'close')) { if(isset($multi_key[$x_tag][$x_level])) { $multi_key[$x_tag][$x_level] = 1; } else { $multi_key[$x_tag][$x_level] = 0; } } if(($x_level != 1) && ($x_type == 'complete')) { if($_tmp == $x_tag) { $multi_key[$x_tag][$x_level] = 1; } $_tmp = $x_tag; } } foreach($vals as $xml_elem) { $x_tag = $xml_elem['tag']; $x_level = $xml_elem['level']; $x_type = $xml_elem['type']; if($x_type == 'open') { $level[$x_level] = $x_tag; } $start_level = 1; $php_stmt = '$xml_array'; if($x_type == 'close' && ($x_level != 1)) { $multi_key[$x_tag][$x_level]++; } while($start_level < $x_level) { $php_stmt .= '[$level[' . $start_level . ']]'; if((isset($multi_key[$level[$start_level]][$start_level])) && ($multi_key[$level[$start_level]][$start_level])) { $php_stmt .= '[' . ($multi_key[$level[$start_level]][$start_level]-1) . ']'; } $start_level++; } $add = ''; if((isset($multi_key[$x_tag][$x_level])) && ($multi_key[$x_tag][$x_level]) && ($x_type == 'open' || $x_type == 'complete')) { if(!isset($multi_key2[$x_tag][$x_level])) { $multi_key2[$x_tag][$x_level] = 0; } else { $multi_key2[$x_tag][$x_level]++; } $add = '[' . $multi_key2[$x_tag][$x_level] . ']'; } if((isset($xml_elem['value'])) && (trim($xml_elem['value']) != '') && (!array_key_exists('attributes',$xml_elem))) { if($x_type == 'open') { $php_stmt_main = $php_stmt . '[$x_type]' . $add . '[\'content\'] = $xml_elem[\'value\'];'; } else { $php_stmt_main = $php_stmt . '[$x_tag]' . $add . ' = $xml_elem[\'value\'];'; } eval($php_stmt_main); } if(array_key_exists('attributes',$xml_elem)) { if(isset($xml_elem['value'])) { $php_stmt_main = $php_stmt . '[$x_tag]' . $add . '[\'content\'] = $xml_elem[\'value\'];'; eval($php_stmt_main); } foreach($xml_elem['attributes'] as $key => $value) { $php_stmt_att = $php_stmt . '[$x_tag]'.$add.'[$key] = $value;'; eval($php_stmt_att); } } } return $xml_array; } // END XMLtoArray */ class XMLtoArray { var $output = array(); var $parser; var $XML; function parse($XML) { $this->parser = xml_parser_create(); xml_set_object($this->parser,$this); xml_set_element_handler($this->parser, "tag_open", "tag_closed"); xml_set_character_data_handler($this->parser, "tag_data"); $XML = str_replace('<', '<![CDATA[<]]>', $XML); $XML = str_replace('>', '<![CDATA[>]]>', $XML); $this->XML = xml_parse($this->parser,$XML ); if(!$this->XML) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($this->parser)), xml_get_current_line_number($this->parser))); } xml_parser_free($this->parser); return $this->output; } function tag_open($parser, $name, $attrs) { $tag = array("name" => $name, "attrs" => $attrs); array_push($this->output, $tag); } function tag_data($parser, $tag_data) { if(trim($tag_data)) { if(isset($this->output[count($this->output)-1]['data'])) { $this->output[count($this->output)-1]['data'] .= $tag_data; } else { $this->output[count($this->output)-1]['data'] = $tag_data; } } } function tag_closed($parser, $name) { $this->output[count($this->output)-2]['children'][] = $this->output[count($this->output)-1]; array_pop($this->output); } } ?> |