note 70241 deleted from ref.xml by bjori
| From: | bjori@php.net | Date: | Mon, 09 Oct 2006 10:52:38 +0000 |
| Subject: | note 70241 deleted from ref.xml by bjori | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-118240@lists.php.net to get a copy of this message | ||
Note Submitter: aaron dot henderson at gmail dot com
----
Like others I found the xml2array function by aerik just brilliant, but had a problem with the regex
not getting all the nodes on the same level. After tinkering with the regex and function for a while
I was able to get it to work and get everything into the array.
<?php
function xml2array ($xml)
{
$xmlary = array ();
if ((strlen ($xml) < 256) && is_file ($xml))
$xml = file_get_contents ($xml);
$ReElements =
'/<(\??\w*)\s*\t*([^>]*)(?:\/>|>(.*?)<(\/\s*\1\s*)>)/is';
$ReAttributes = '/(\w+)=(?:"|\')([^"\']*)(:?"|\')/s';
preg_match_all ($ReElements, $xml, $elements);
//print_r($elements);
foreach ($elements[1] as $ie => $xx) {
$xmlary[$ie]["name"] = $elements[1][$ie];
if ( $attributes = trim($elements[2][$ie])) {
preg_match_all ($ReAttributes, $attributes, $att);
foreach ($att[1] as $ia => $xx)
// all the attributes for current element are added here
$xmlary[$ie]["attributes"][$att[1][$ia]] = $att[2][$ia];
} // if $attributes
// get text if it's combined with sub elements
$cdend = strpos($elements[3][$ie],"<");
if ($cdend > 0) {
$xmlary[$ie]["text"] = substr($elements[3][$ie],0,$cdend -1);
} // if cdend
if (preg_match ($ReElements, $elements[3][$ie])){
$xmlary[$ie]["elements"] = xml2array ($elements[3][$ie]);
}
else if (isset($elements[3][$ie])){
$xmlary[$ie]["text"] = $elements[3][$ie];
}
$xmlary[$ie]["closetag"] = $elements[4][$ie];
}//foreach ?
return $xmlary;
}
?>