/**
* ChronoFish May 2009
* www.chronofish.com
*
* xml2array will convert an XML document to an array.
* When attributes is true, resultant array will group by tag and exact-match attributes.
* When attributes is false, resultant array will group by tag and ignore attributes.
*
* The resultant array will be an associative array with tag (or tag + attributues) as the key. Each value
* will either be an XML2Array array (another associative array), or an array of value.
*
* Assumptions:
* 1. XML is well formed
* 2. White space is wrapped in CDATA
***/
function xml2array
($originalXML,
$attributes=
true)
{
$xmlArray =
array();
$search =
$attributes ?
'|<((\S+)(.*))\s*>(.*)</\2>|Ums' :
'|<((\S+)()).*>(.*)</\2>|Ums';
// normalize data
$xml =
preg_replace('|>\s*<|',
">\n<",
$originalXML);
// one tag per line
$xml =
preg_replace('|<\?.*\?>|',
'',
$xml);
// remove XML declarations
$xml =
preg_replace('|<(\S+?)(.*)/>|U',
'<$1$2></$1>',
$xml);
//Expand singletons
if (!
preg_match_all($search,
$xml,
$xmlMatches))
return trim($originalXML);
// bail out - no XML found
foreach ($xmlMatches[1] as $index =>
$key)
{
if (!
isset($xmlArray[$key])) $xmlArray[$key] =
array();
$xmlArray[$key][] = xml2array
($xmlMatches[4][$index],
$attributes);
}
return $xmlArray;
}