<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>
<div><font class="Apple-style-span" face="Tahoma" size="2"><div>&gt; I've tried simplexml and a few third-party scripts, one that loads the&nbsp;</div><div>&gt; xml into an associative array rather than an object, and nothing lets me&nbsp;</div><div>&gt; get at 'red' or 'blue'.&nbsp;</div><div><br></div><div>I needed something similar for my module. First of all, I wanted it to be compatible with PHP4. This means I needed to use xml_parser functions. Second, I didn't want the user to have to install another module or library.</div><div><br></div><div>I ended up using two functions (one is recursive):</div><div><br></div><div>/**</div><div>&nbsp;* Takes an XML string, and returns a multidimensional array. Each "dimension"</div><div>&nbsp;* may be a text string, a key-value array of tag attributes, and/or another</div><div>&nbsp;* multidimensional array containing child nodes.</div><div>&nbsp;*</div><div>&nbsp;* @param $string</div><div>&nbsp;* &nbsp; &nbsp; String containing XML data to parse</div><div>&nbsp;* @return</div><div>&nbsp;* &nbsp; &nbsp; Multidimensional array with attributes, values, and children</div><div>&nbsp;*/</div><div>function _discogs_xml_to_array(&amp;$string) {</div><div>&nbsp;&nbsp;$parser = xml_parser_create();</div><div>&nbsp;&nbsp;xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);</div><div>&nbsp;&nbsp;xml_parse_into_struct($parser, $string, $vals, $index);</div><div>&nbsp;&nbsp;xml_parser_free($parser);</div><div><br></div><div>&nbsp;&nbsp;$multi_array = array();</div><div>&nbsp;&nbsp;foreach ($vals as $val) {</div><div>&nbsp;&nbsp; &nbsp;$tag = $val['tag'];</div><div>&nbsp;&nbsp; &nbsp;if ($val['type'] == 'open') {</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if (isset($multi_array[$tag])) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (isset($multi_array[$tag][0])) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$multi_array[$tag][]=array();</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$multi_array[$tag]=array($multi_array[$tag], array());</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$cv = &amp;$multi_array[$tag][count($multi_array[$tag])-1];</div><div>&nbsp;&nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp; &nbsp;else {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$cv = &amp;$multi_array[$tag];</div><div>&nbsp;&nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if (isset($val['attributes'])) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;foreach ($val['attributes'] as $k =&gt; $v) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$cv['_attributes'][$k] = $v;</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$cv['_nodes'] = array();</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$cv['_nodes']['_recursion'] = &amp;$multi_array;</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$multi_array = &amp;$cv['_nodes'];</div><div>&nbsp;&nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp;elseif ($val['type'] == 'complete') {</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if (isset($multi_array[$tag])) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (isset($multi_array[$tag][0])) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$multi_array[$tag][] = array();</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$multi_array[$tag] = array($multi_array[$tag], array());</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$cv = &amp;$multi_array[$tag][count($multi_array[$tag])-1];</div><div>&nbsp;&nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp; &nbsp;else {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$cv = &amp;$multi_array[$tag];</div><div>&nbsp;&nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if (isset($val['attributes'])) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;foreach ($val['attributes'] as $k =&gt; $v) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$cv['_attributes'][$k] = $v;</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if (isset($val['value'])) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$cv['value'] = trim($val['value']);</div><div>&nbsp;&nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp;elseif ($val['type'] == 'close') {</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$multi_array = &amp;$multi_array['_recursion'];</div><div>&nbsp;&nbsp; &nbsp;}</div><div>&nbsp;&nbsp;}</div><div><div>&nbsp;&nbsp;// Clean up the recursion and merge attributes with child nodes</div><div>&nbsp;&nbsp;$multi_array = _discogs_xml_clean($multi_array);</div></div><div><br></div><div>&nbsp;&nbsp;return $multi_array;</div><div>}</div><div><br></div><div>/**</div><div>&nbsp;* Helper function for _discogs_xml_to_array.</div><div>&nbsp;*</div><div>&nbsp;* Cleans up the array structure, by getting rid of the recursive data, and</div><div>&nbsp;* merging the values, attributes and child nodes.</div><div>&nbsp;*</div><div>&nbsp;* @param array $old_array</div><div>&nbsp;* &nbsp; Old array to clean up</div><div>&nbsp;* @return array $new_array</div><div>&nbsp;* &nbsp; Cleaned up array</div><div>&nbsp;*/</div><div>function _discogs_xml_clean($old_array) {</div><div>&nbsp;&nbsp;// Double check that it's an array, for recursion</div><div>&nbsp;&nbsp;if (!is_array($old_array)) {</div><div>&nbsp;&nbsp; &nbsp;return $old_array;</div><div>&nbsp;&nbsp;}</div><div>&nbsp;&nbsp;foreach ($old_array as $k =&gt; $v) {</div><div>&nbsp;&nbsp; &nbsp;if ($k === '_recursion') {</div><div>&nbsp;&nbsp; &nbsp; &nbsp;unset($old_array[$k]);</div><div>&nbsp;&nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp;elseif (is_array($old_array[$k]['_nodes']) &amp;&amp; is_array($old_array[$k]['_attributes'])) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$old_nodes = _discogs_xml_clean($old_array[$k]['_nodes']);</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$new_merged = array_merge($old_array[$k]['_attributes'], $old_nodes);</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$new_array[$k] = $new_merged;</div><div>&nbsp;&nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp;elseif (isset($old_array[$k]['value']) &amp;&amp; is_array($old_array[$k]['_attributes'])) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$value['value'] = trim($old_array[$k]['value']);</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$new_merged = array_merge($old_array[$k]['_attributes'], $value);</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$new_array[$k] = $new_merged;</div><div>&nbsp;&nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp;elseif (is_array($old_array[$k]['_nodes'])) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$new_array[$k] = _discogs_xml_clean($old_array[$k]['_nodes']);</div><div>&nbsp;&nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp;elseif (isset($old_array[$k]['_attributes'])) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$new_array[$k] = $old_array[$k]['_attributes'];</div><div>&nbsp;&nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp;elseif (isset($old_array[$k]['value'])) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$new_array[$k] = $old_array[$k]['value'];</div><div>&nbsp;&nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp;else {</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$old_nodes = _discogs_xml_clean($old_array[$k]);</div><div>&nbsp;&nbsp; &nbsp; &nbsp;$new_array[$k] = $old_nodes;</div><div>&nbsp;&nbsp; &nbsp;}</div><div>&nbsp;&nbsp;}</div><div>&nbsp;&nbsp;return $new_array;</div><div>}</div><div><br></div><div>So, if you passed your XML file to the first function, this would be the resulting multidimensional array:</div><div><br></div><div>Array</div><div>(</div><div>&nbsp;&nbsp;[this] =&gt; Array</div><div>&nbsp;&nbsp; &nbsp;(</div><div>&nbsp;&nbsp; &nbsp; &nbsp;[that] =&gt; Array</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;(</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[0] =&gt; Array</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[parm1] =&gt; a</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[parm2] =&gt; b</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[parm3] =&gt; c</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[value] =&gt; red</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;)</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[1] =&gt; Array</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[parm1] =&gt; e</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[parm2] =&gt; f</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[parm3] =&gt; d</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[value] =&gt; blue</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;)</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;)</div><div>&nbsp;&nbsp; &nbsp;)</div><div>)</div><div><br></div><div>It's complicated, but it works.</div><div><br></div><div>-Karl.</div></font></div>                                               </body>
</html>