XML to Array

From: Date: Sun, 10 Mar 2013 10:47:54 +0000
Subject: XML to Array
Groups: php.general 
Request: Send a blank email to php-general+get-320446@lists.php.net to get a copy of this message
Hi Guys, I am hoping someone can guide me or help me fix this issue. I have been lost in the code for some time now. I am trying to get the attributes of an xml node. I have this code: function xml_parse_into_assoc($data) {
    $p = xml_parser_create();
if(stripos($data, "http", 0) !== false) {
		    if (!($fp = @ fopen($data, 'rb')))
		    {
		        return array ();
		    }
		    while (!feof($fp))
		    {
		        $xml .= fread($fp, 8192);
		    }
		    fclose($fp);
	    } else if(stripos($data, "<?", 0) !== false) {
	    	$xml .= $data;
	    }
xml_parser_set_option($p, XML_OPTION_TARGET_ENCODING, "ISO-8859-1"); //xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1); xml_parse_into_struct($p, $xml, $vals, $index); xml_parser_free($p); $levels = array(null); foreach ($vals as $val) {
		    if ($val['type'] == 'open' || $val['type'] == 'complete') {
		      if (!array_key_exists($val['level'], $levels)) {
		        $levels[$val['level']] = array();
		      }
		    }
		    $prevLevel = &$levels[$val['level'] - 1];
		    $parent = $prevLevel[sizeof($prevLevel)-1];
		    if ($val['type'] == 'open') {
		      $val['children'] = array();
		      $val['attributes'] = array();
		      array_push(&$levels[$val['level']], $val);
		      continue;
		    }
		    else if ($val['type'] == 'complete') {
		      $parent['children'][$val['tag']] = $val['value'];
		    }
		    else if ($val['type'] == 'close') {
		      $pop = array_pop($levels[$val['level']]);
		      $tag = $pop['tag'];
		      if ($parent) {
		        if (!array_key_exists($tag, $parent['children'])) {
		          $parent['children'][$tag] = $pop['children'];
		        }
		        else if (is_array($parent['children'][$tag])) {
		            if(!isset($parent['children'][$tag][0])) {
		                $oldSingle = $parent['children'][$tag];
		                $parent['children'][$tag] = null;
		                $parent['children'][$tag][] = $oldSingle;
		            }
		              $parent['children'][$tag][] = $pop['children'];
		        } else if (array_key_exists('attributes', $val)) {
		            if (isset($val['value'])) {
		                $parent['children'][$tag] = $val['value'];
		            }
		            foreach ($val['attributes'] as $key=>$value) {
		                $parent['children'][$tag][$key] = $value;
		            }
		      	}
		      } else {
		        return(array($pop['tag'] => $pop['children']));
		      }
		    }
		    $prevLevel[sizeof($prevLevel)-1] = $parent;
} } This is the part I am adding to try and acheive this. ... else if (array_key_exists('attributes', $val)) {
		            if (isset($val['value'])) {
		                $parent['children'][$tag] = $val['value'];
		            }
		            foreach ($val['attributes'] as $key=>$value) {
		                $parent['children'][$tag][$key] = $value;
		            }
		      	}
... I do admit I haven't the foggiest idea what I am doing here, so I am noobing out here on how this php function is really working. I got it off php.net and am trying to implement it in my code. Without my addition it works well except it doesn't grab any attributes which I need in order for my script to work properly. Any ideas on what I am doing wrong? TIA, Best, Karl PS: please be gentle.. (: )) Karl DeSaulniers Design Drumm http://designdrumm.com

« previous php.general (#320446) next »