s0c0 Posted February 19, 2009 Share Posted February 19, 2009 I am attempting to load a string of xml as an object using simplexml_load_string. However, the creator of this XML has made this difficult by having hyphens in the name. Here is an example: <?xml version="1.0"?> <thexml> <result>OK</result> <xml-log-in> <accounts> <account> <account-id>1111111111111</account-id> </account> </accounts> </xml-log-in> </thexml> So when I try to reference account-id: $xml = @simplexml_load_string($response); echo $xml->xml-log-in->accounts->account->account-id; It fails miserably. Really I think its moronic that PHP decided to have simple_xml_load_string return an object in the first place. It should have been an array. Is there an easy way to convert XML to an array. The XML I am returning is very very deep in some places, so it could be a 3 to 5 dimensional array. Any ideas? Quote Link to comment https://forums.phpfreaks.com/topic/146025-problem-with-simplexml_load_string/ Share on other sites More sharing options...
premiso Posted February 19, 2009 Share Posted February 19, 2009 <?php function xml2array($url, $get_attributes = 1, $priority = 'tag') { $contents = ""; if (!function_exists('xml_parser_create')) { return array (); } $parser = xml_parser_create(''); if (!($fp = @ fopen($url, 'rb'))) { return array (); } while (!feof($fp)) { $contents .= fread($fp, 8192); } fclose($fp); xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); xml_parse_into_struct($parser, trim($contents), $xml_values); xml_parser_free($parser); if (!$xml_values) return; //Hmm... $xml_array = array (); $parents = array (); $opened_tags = array (); $arr = array (); $current = & $xml_array; $repeated_tag_index = array (); foreach ($xml_values as $data) { unset ($attributes, $value); extract($data); $result = array (); $attributes_data = array (); if (isset ($value)) { if ($priority == 'tag') $result = $value; else $result['value'] = $value; } if (isset ($attributes) and $get_attributes) { foreach ($attributes as $attr => $val) { if ($priority == 'tag') $attributes_data[$attr] = $val; else $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr' } } if ($type == "open") { $parent[$level -1] = & $current; if (!is_array($current) or (!in_array($tag, array_keys($current)))) { $current[$tag] = $result; if ($attributes_data) $current[$tag . '_attr'] = $attributes_data; $repeated_tag_index[$tag . '_' . $level] = 1; $current = & $current[$tag]; } else { if (isset ($current[$tag][0])) { $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result; $repeated_tag_index[$tag . '_' . $level]++; } else { $current[$tag] = array ( $current[$tag], $result ); $repeated_tag_index[$tag . '_' . $level] = 2; if (isset ($current[$tag . '_attr'])) { $current[$tag]['0_attr'] = $current[$tag . '_attr']; unset ($current[$tag . '_attr']); } } $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1; $current = & $current[$tag][$last_item_index]; } } elseif ($type == "complete") { if (!isset ($current[$tag])) { $current[$tag] = $result; $repeated_tag_index[$tag . '_' . $level] = 1; if ($priority == 'tag' and $attributes_data) $current[$tag . '_attr'] = $attributes_data; } else { if (isset ($current[$tag][0]) and is_array($current[$tag])) { $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result; if ($priority == 'tag' and $get_attributes and $attributes_data) { $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data; } $repeated_tag_index[$tag . '_' . $level]++; } else { $current[$tag] = array ( $current[$tag], $result ); $repeated_tag_index[$tag . '_' . $level] = 1; if ($priority == 'tag' and $get_attributes) { if (isset ($current[$tag . '_attr'])) { $current[$tag]['0_attr'] = $current[$tag . '_attr']; unset ($current[$tag . '_attr']); } if ($attributes_data) { $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data; } } $repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken } } } elseif ($type == 'close') { $current = & $parent[$level -1]; } } return ($xml_array); } ?> Found at xml_parse in the user comments. Perhaps that will help you? EDIT: Also found this on the simplexml load file page: <?php function object2array($object) { $return = NULL; if(is_array($object)) { foreach($object as $key => $value) $return[$key] = object2array($value); } else { $var = get_object_vars($object); if($var) { foreach($var as $key => $value) $return[$key] = ($key && !$value) ? NULL : object2array($value); } else return $object; } return $return; } ?> http://us2.php.net/manual/en/function.simplexml-load-file.php#56691 Quote Link to comment https://forums.phpfreaks.com/topic/146025-problem-with-simplexml_load_string/#findComment-766596 Share on other sites More sharing options...
s0c0 Posted February 19, 2009 Author Share Posted February 19, 2009 I should have mentioned that converting to an object to an array (in this instance) fails as I had already tried that with a method I wrote. This method also fails. However the xml2array function seems to work just fine, though it will require some modifications. I am worried about its scalability however. Thanks. Quote Link to comment https://forums.phpfreaks.com/topic/146025-problem-with-simplexml_load_string/#findComment-766608 Share on other sites More sharing options...
premiso Posted February 19, 2009 Share Posted February 19, 2009 I should have mentioned that converting to an object to an array (in this instance) fails as I had already tried that with a method I wrote. This method also fails. However the xml2array function seems to work just fine, though it will require some modifications. I am worried about its scalability however. Thanks. Yep no clue. Given that people took the time to write it, there probably is not an easier or better way, unfortunately. It would be nice if they had a toArray feature in the simplexml object, but oh well Quote Link to comment https://forums.phpfreaks.com/topic/146025-problem-with-simplexml_load_string/#findComment-766611 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.