views:

644

answers:

3

Hi all I want to write a function that parses a (theoretically) unknown XML data structure into an equivalent PHP array.

Here is my sample XML:

<?xml version="1.0" encoding="UTF-8"?>
<content>

<title>Sample Text</title>

<introduction>
    <paragraph>This is some rudimentary text</paragraph>
</introduction>
<description>
    <paragraph>Here is some more text</paragraph>
    <paragraph>Even MORE text</paragraph>
    <sub_section>
        <sub_para>This is a smaller, sub paragraph</sub_para>
        <sub_para>This is another smaller, sub paragraph</sub_para>
    </sub_section>
</description>
</content>

I modified this DOM iterating function from devarticles:

$data = 'path/to/xmldoc.xml';
$xmlDoc = new DOMDocument(); #create a DOM element
$xmlDoc->load( $data ); #load data into the element
$xmlRoot = $xmlDoc->firstChild; #establish root

function xml2array($node)
    {
    if ($node->hasChildNodes())
    {
$subNodes = $node->childNodes;
    foreach ($subNodes as $subNode)
        {
        #filter node types
        if (($subNode->nodeType != 3) || (($subNode->nodeType == 3)))   
            {
            $arraydata[$subNode->nodeName]=$subNode->nodeValue;
            }
         xml2array($subNode);
         }
      }
      return $arraydata;
   }
//The getNodesInfo function call

 $xmlarray = xml2array($xmlRoot);


// print the output - with a little bit of formatting for ease of use...
foreach($xmlarray as $xkey)
     {
     echo"$xkey<br/><br/>";
     }

Now, because of the way I'm passing the elements to the array I'm overwriting any elements that share a node name (since I ideally want to give the keys the same names as their originating nodes). My recursion isn't great... However, even if I empty the brackets - the second tier of nodes are still coming in as values on the first tier (see the text of the description node).

Anyone got any ideas how I can better construct this?

+1  A: 

You might be better off just snagging some code off the net

http://www.bin-co.com/php/scripts/xml2array/

 /**
  * xml2array() will convert the given XML text to an array in the XML structure.
  * Link: http://www.bin-co.com/php/scripts/xml2array/
  * Arguments : $contents - The XML text
  *                $get_attributes - 1 or 0. If this is 1 the function will get the attributes as well as the tag values - this results in a different array structure in the return value.
  *                $priority - Can be 'tag' or 'attribute'. This will change the way the resulting array sturcture. For 'tag', the tags are given more importance.
  * Return: The parsed XML in an array form. Use print_r() to see the resulting array structure.
  * Examples: $array =  xml2array(file_get_contents('feed.xml'));
  *              $array =  xml2array(file_get_contents('feed.xml', 1, 'attribute'));
  */
 function xml2array($contents, $get_attributes=1, $priority = 'tag') {
Byron Whitlock
+1  A: 

You might be interested in SimpleXML or xml_parse_into_struct.

$arraydata is neither passed to subsequent calls to xml2array() nor is the return value used, so yes "My recursion isn't great..." is true ;-)
To append a new element to an existing array you can use empty square brackets, $arr[] = 123; $arr[$x][] = 123;

VolkerK
I did make a method that passes the array back in, but I want to figure out why it's not seeing those 2nd tier nodes. Also, how does one keep adding that last set of empty parentheses on an array of unknown depth?
sunwukung
I mean, have you seen the script in the post above yours....it's a beast!
sunwukung
A: 

You might also want to check out XML Unserializer

http://pear.php.net/package/XML_Serializer/redirected

grantwparks
that works a treat - problem solved!
sunwukung