Serialisation et deserialisation d'un objet vers du xml

Contenu du snippet

<?php
/**
* CLASS xmlSerializer
* object to xml serialization and unserialization
* @auteur : johan <barbier_johan@hotmail.com>
* @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;
 }

}
?>


Compatibilité : PHP 5

Disponible dans d'autres langages :

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.