<?php
 
/**
 
* CLASS xmlSerializer
 
* object to xml serialization and unserialization
 
* @auteur : johan <[email protected]>
 
* @version : 1
 
* @date : 2006/03/22
 
*
 
* free to use, modify, please just tell me if you make any changes :-)
 
*/
 
class xmlserialize {
 
 
    /**
 
    * private object oObj
 
    * the object we work on
 
    */
 
    private $oObj = null;
 
    /**
 
    * private array of object oPropObj
 
    * objects needed by the main object, because some of its properties are objects
 
    */
 
    private $oPropObj = array ();
 
    /**
 
    * private array aProps
 
    * the PUBLIC properties of the object
 
    */
 
    private $aProps = array ();
 
    /**
 
    * private string xml
 
    * the xml serailization of the object
 
    */
 
    private $xml = '';
 
    /**
 
    * public string node
 
    * a fragment of the xml string
 
    */
 
    public $node = '';
 
 
    /**
 
    * public function __construct
 
    * constructor
 
    * @Param (object) $obj : the object we want to serialize/unserialize
 
    * @Param (array) $oPropObj : array of objects needed by the main object
 
    */
 
    public function __construct ($obj, array $oPropObj = array ()) {
 
        if (!is_object ($obj)) {
 
            return false;
 
        } else {
 
            $this -> oObj = $obj;
 
        }
 
        if (!empty ($oPropObj)) {
 
            foreach ($oPropObj as $clef => $oVal) {
 
                if (is_object ($oVal)) {
 
                  $this -> oPropObj[$clef]['object'] = $oVal;
 
                  $this -> oPropObj[$clef]['class'] = get_class ($oVal);
 
                }
 
            }
 
        }
 
    }
 
 
    /**
 
    * public function getProps ()
 
    * method used to get the public properties of the object
 
    */
 
    public function getProps () {
 
        $this -> aProps = get_object_vars ($this -> oObj);
 
    }
 
 
    /**
 
    * private function recVarsToXml
 
    * method used to serialize the object, recursive
 
    * @Params (DomDocument) & docXml : the DomDocument object
 
    * @Params (DomElement) & xml : the current DomElement object
 
    * @Params (array) & aProps : the array of properties we work on recursively
 
    */
 
    private function recVarsToXml (& $docXml, & $xml, & $aProps) {
 
        foreach ($aProps as $clef => $val) {
 
            if (empty ($clef) || is_numeric ($clef)) {
 
                $clef = '_'.$clef;
 
            }
 
            $domClef = $docXml -> createElement ((string)$clef);
 
            $domClef = $xml -> appendChild ($domClef);
 
            if (is_scalar ($val)) {
 
                $valClef = $docXml -> createTextNode ((string)$val);
 
                $valClef = $domClef -> appendChild ($valClef);
 
            } else {
 
                if (is_array ($val)) {
 
                    $this -> recVarsToXml ($docXml, $domClef, $val);
 
                }
 
                if (is_object ($val)) {
 
                    $oXmlSerialize = new self ($val);
 
                    $oXmlSerialize -> getProps ();
 
                    $oXmlSerialize -> varsToXml ();
 
                    $objClef = $docXml -> importNode ($oXmlSerialize -> node, true);
 
                    $objClef = $domClef -> appendChild ($objClef);
 
                }
 
            }
 
        }
 
    }
 
 
    /**
 
    * public function varsToXml
 
    * method used to serialize the object
 
    * @Return (string) $xml : the xml string of the serialized object
 
    */
 
    public function varsToXml () {
 
        $docXml = new DOMDocument ('1.0', 'iso-8859-1');
 
        $xml = $docXml -> createElement ('object_'.get_class ($this -> oObj));
 
        $xml = $docXml -> appendChild ($xml);
 
        $this -> recVarsToXml ($docXml, $xml, $this -> aProps);
 
        $this -> node = $xml;
 
        return $this -> xml = $docXml -> saveXML ();
 
    }
 
 
    /**
 
    * private function recXmlToVars
 
    * method used to unserialize the object, recursive
 
    * @Param (array) aProps : the array we work on recursively
 
    */
 
    private function recXmlToVars ($aProps) {
 
        foreach ($aProps as $clef => $val) {
 
            $cpt = count ($val);
 
            if ($cpt > 0) {
 
                foreach ($val as $k => $v) {
 
                    $cpt2 = count ($v);
 
                    if ($cpt2 > 0) {
 
                          if (substr ($k, 0, 7) === 'object_') {
 
                            foreach ($this -> oPropObj as $kObj => $vObj) {
 
                                if ($this -> oPropObj[$kObj]['class'] === substr ($k, 7)) {
 
                                    $oXmlSerializer = new self ($this -> oPropObj[$kObj]['object']);
 
                                    $oXmlSerializer -> getProps ();
 
                                    $sXml = $oXmlSerializer -> varsToXml ();
 
                                    $oXmlSerializer -> xmlToVars ($sXml);
 
                                    $this -> oObj -> {$clef}[substr ($k, 7)] = $oXmlSerializer -> getObj ();
 
                                }
 
                            }
 
                        } else {
 
                            $this -> recXmlToVars ($v);
 
                        }
 
                    } else {
 
                        if ($k{0} === '_') {
 
                            $k = substr ($k, 1, strlen($k) - 1);
 
                        }
 
                        $this -> oObj -> {$clef}[$k] = current ($v);
 
                    }
 
                }
 
            } elseif (!empty ($val)) {
 
                $this -> oObj -> $clef = current ($val);
 
            }
 
        }
 
    }
 
 
    /**
 
    * public function xmlToVars
 
    * method used to unserialize the object
 
    * @Param (string) xml : optional xml string (an already serialized object)
 
    */
 
    public function xmlToVars ($xml = '') {
 
        if (empty ($xml)) {
 
            $xml = simplexml_load_string ($this -> xml);
 
        } else {
 
            $xml = simplexml_load_string ($xml);
 
        }
 
        $this -> recXmlToVars ($xml);
 
    }
 
 
    /**
 
    * public function getObj
 
    * method used to get the unserialized object
 
    * @Return (object) oObj : the unserialized object
 
    */
 
    public function getObj () {
 
        return $this -> oObj;
 
    }
 
 
}
 
?>
 
 |