note 88264 modified in class.xmlreader by danbrown

From: Date: Mon, 19 Jan 2009 16:50:39 +0000
Subject: note 88264 modified in class.xmlreader by danbrown
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-149450@lists.php.net to get a copy of this message
XML to ASSOCIATIVE ARRAY Improved algorithm based on Sergey Aikinkulov's. The problem was that it would overwrite nodes if they had the same tag name. Because of that <a><b/><b/><a> would be read as if <a><b/><a/>. This algorithm handles it better and outputs an easy to understand array: <?php function xml2assoc($xml) { $tree = null; while($xml->read()) switch ($xml->nodeType) { case XMLReader::END_ELEMENT: return $tree; case XMLReader::ELEMENT: $node = array('tag' => $xml->name, 'value' => $xml->isEmptyElement ? '' : xml2assoc($xml)); if($xml->hasAttributes) while($xml->moveToNextAttribute()) $node['attributes'][$xml->name] = $xml->value; $tree[] = $node; break; case XMLReader::TEXT: case XMLReader::CDATA: $tree .= $xml->value; } return $tree; } ?> Usage: myxml.xml: ------ <PERSON> <NAME>John</NAME> <PHONE type="home">555-555-555</PHONE> </PERSON> ---- <? $xml = new XMLReader(); $xml->open('myxml.xml'); $assoc = xml2assoc($xml); $xml->close(); print_r($assoc); ?> Outputs: Array ( [0] => Array ( [tag] => PERSON [value] => Array ( [0] => Array ( [tag] => NAME [value] => John ) [1] => Array ( [tag] => PHONE [value] => 555-555-555 [attributes] => Array ( [type] => home ) ) ) ) ) For reasons that have to do with recursion, it returns an array with the ROOT xml node as the first childNode, rather than to return only the ROOT node. --was-- XML to ASSOCIATIVE ARRAY Improved algorithm based on Sergey Aikinkulov's. The problem was that it would overwrite nodes if they had the same tag name. Because of that <a><b/><b/><a> would be read as if <a><b/><a/>. This algorithm handles it better and outputs an easy to understand array: <? function xml2assoc($xml) { $tree = null; while($xml->read()) switch ($xml->nodeType) { case XMLReader::END_ELEMENT: return $tree; case XMLReader::ELEMENT: $node = array('tag' => $xml->name, 'value' => $xml->isEmptyElement ? '' : xml2assoc($xml)); if($xml->hasAttributes) while($xml->moveToNextAttribute()) $node['attributes'][$xml->name] = $xml->value; $tree[] = $node; break; case XMLReader::TEXT: case XMLReader::CDATA: $tree .= $xml->value; } return $tree; } ?> Usage: myxml.xml: ------ <PERSON> <NAME>John</NAME> <PHONE type="home">555-555-555</PHONE> </PERSON> ---- <? $xml = new XMLReader(); $xml->open('myxml.xml'); $assoc = xml2assoc($xml); $xml->close(); print_r($assoc); ?> Outputs: Array ( [0] => Array ( [tag] => PERSON [value] => Array ( [0] => Array ( [tag] => NAME [value] => John ) [1] => Array ( [tag] => PHONE [value] => 555-555-555 [attributes] => Array ( [type] => home ) ) ) ) ) For reasons that have to do with recursion, it returns an array with the ROOT xml node as the first childNode, rather than to return only the ROOT node. http://php.net/manual/en/class.xmlreader.php

« previous php.notes (#149450) next »