note 55904 deleted from function.xml-parse-into-struct by sniper
| From: | sniper@php.net | Date: | Mon, 28 Nov 2005 13:09:29 +0000 |
| Subject: | note 55904 deleted from function.xml-parse-into-struct by sniper | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-99241@lists.php.net to get a copy of this message | ||
Note Submitter: jeffg at activestate dot com
----
/*
* _xml2array - an abstraction layer on xml_parse_into_struct that returns a
* nice nested array. based on dudus at onet dot pl's:
* http://www.php.net/manual/en/function.xml-parse-into-struct.php#49154
* changes made are:
* - nicer formatting of code
* - set xml parser options to make array keys lowercase / ignore whitespace
* - stuffed attributes into a child array of the same name
**/
/*
* @param: $raw_xml - string containing xml to feed into xml_parse_into_struct()
* returns nice nested php array containing xml data.
**/
function _xml2array($raw_xml) {
$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, $raw_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.'[\'attributes\'][$key] =
$value;';
eval($php_stmt_att);
}
}
}
return $xml_array;
}