#native_company# #native_desc#
#native_cta#

Converting XML into a PHP data structure Page 8

By PHP Builder Staff
on December 25, 2002

The Completed XMLToArray Class

<?php

//######################################################################

class XMLToArray {

    //----------------------------------------------------------------------

    // private variables

    
var $parser;

    var 
$node_stack = array();

    //----------------------------------------------------------------------

    /** PUBLIC

     * If a string is passed in, parse it right away.

     */

    
function XMLToArray($xmlstring="") {

        if (
$xmlstring) return($this->parse($xmlstring));

        return(
true);

    }

    //----------------------------------------------------------------------

    /** PUBLIC

     * Parse a text string containing valid XML into a multidimensional array

     * located at rootnode.

     */

    
function parse($xmlstring="") {

        
// set up a new XML parser to do all the work for us

        
$this->parser xml_parser_create();

        
xml_set_object($this->parser$this);

        
xml_parser_set_option($this->parserXML_OPTION_CASE_FOLDINGfalse);

        
xml_set_element_handler($this->parser"startElement""endElement");

        
xml_set_character_data_handler($this->parser"characterData");

        // Build a Root node and initialize the node_stack...

        
$this->node_stack = array();

        
$this->startElement(null"root", array());

        // parse the data and free the parser...

        
xml_parse($this->parser$xmlstring);

        
xml_parser_free($this->parser);

        // recover the root node from the node stack

        
$rnode array_pop($this->node_stack);

        // return the root node...

        
return($rnode);

    }

    //----------------------------------------------------------------------

    /** PROTECTED

     * Start a new Element.  This means we push the new element onto the stack

     * and reset it's properties.

     */

    
function startElement($parser$name$attrs) {

        
// create a new node...

        
$node = array();

        
$node["_NAME"]      = $name;

        foreach (
$attrs as $key => $value) {

            
$node[$key] = $value;

        }

        
$node["_DATA"]      = "";

        
$node["_ELEMENTS"]  = array();

        // add the new node to the end of the node stack

        
array_push($this->node_stack$node);

    }

    //----------------------------------------------------------------------

    /** PROTECTED

     * End an element.  This is done by popping the last element from the

     * stack and adding it to the previous element on the stack.

     */

    
function endElement($parser$name) {

        
// pop this element off the node stack

        
$node array_pop($this->node_stack);

        
$node["_DATA"] = trim($node["_DATA"]);

        // and add it an an element of the last node in the stack...

        
$lastnode count($this->node_stack);

        
array_push($this->node_stack[$lastnode-1]["_ELEMENTS"], $node);

    }

    //----------------------------------------------------------------------

    /** PROTECTED

     * Collect the data onto the end of the current chars.

     */

    
function characterData($parser$data) {

        
// add this data to the last node in the stack...

        
$lastnode count($this->node_stack);

        
$this->node_stack[$lastnode-1]["_DATA"] .= $data;

    }

    //----------------------------------------------------------------------

}

//######################################################################

//##  END OF CLASS

//######################################################################

?>



1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|