Description : History : - 25/3/9 inital version */ /* Read a raw XML string (one level only) and return an array of data */ function importxml($data, $base = false) { /* Create XML parser */ $xml_parser = xml_parser_create(); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, 1); xml_parse_into_struct($xml_parser, $data, $vals, $index); xml_parser_free($xml_parser); $params = array(); $level = array(); foreach ($vals as $xml_elem) { /* Create key from atribute */ if ($xml_elem['type'] == 'open') { if (array_key_exists('attributes',$xml_elem)) { list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']); } else { $level[$xml_elem['level']] = $xml_elem['tag']; } } /* Go back to previous level */ if ($xml_elem['type'] == 'complete') { $start_level = 1; $php_stmt = '$params'; while($start_level < $xml_elem['level']) { $php_stmt .= '[$level['.$start_level.']]'; $start_level++; } $php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];'; eval($php_stmt); } } /* Remove base from XML tree */ if ($base) return current($params) ? current($params) : array(); return $params; } /** Create a CDATA field * * @param str a data string */ function cdata($str) { if (preg_match("/[<>&]/", $str)) return ""; return $str; } /** Create an XML string and return it * * @param data the array of data * @param base the XML structure base (optional) */ function exportxml($data, $base = false, $xmlstr = "") { /* Create header */ if (!$xmlstr) { $xmlstr = "\n"; } /* Starting tag */ if ($base) $xmlstr .= "<".$base.">\n"; /* For all key in array... */ foreach ($data as $key => $val) if (is_array($val)) $xmlstr = exportxml($val, $key, $xmlstr); else $xmlstr .= "<".$key.">".cdata($val)."\n"; /* Ending tag*/ if ($base) $xmlstr .= "\n"; return $xmlstr; }