<?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;
}
}
?>
|