$guid), $to_be_serialised);
// Sanity check
if (!is_array($to_be_serialised)) throw new ExportException("There was a problem during the serialisation of GUID:$guid");
// Now serialise the result to XML
$wrapper = new stdClass;
// Construct header
$wrapper->header = new stdClass;
$wrapper->header->date = date("r");
$wrapper->header->timestamp = time();
$wrapper->header->domain = $CONFIG->wwwroot;
$wrapper->header->guid = $guid;
$wrapper->header->uuid = guid_to_uuid($guid);
$wrapper->header->exported_by = guid_to_uuid($_SESSION['id']);
// Construct data
$wrapper->data = $to_be_serialised;
return serialise_object_to_xml($wrapper, "elggexport");
/*
XML will look something like this:
556
Marcus Povey
...
Foo
baaaa
Monkey
bibble
...
Foo
baaaa
...
...
*/
}
/**
* Import an XML serialisation of an object.
* This will make a best attempt at importing a given xml doc.
*
* @param string $xml
* @return int The new GUID of the object.
*/
function import($xml)
{
// import via object ?
// import via tag : so you pass a tag "" and all its contents out and something answers by handling it.
// THis is recursive but bredth first.
}
/**
* Generate a UUID from a given GUID.
*
* @param int $guid The GUID of an object.
*/
function guid_to_uuid($guid)
{
global $CONFIG;
return "UUID:".md5($CONFIG->wwwroot) . ":$guid";
}
/**
* This function serialises an object recursively into an XML representation.
* The function attempts to call $data->export() which expects a stdClass in return, otherwise it will attempt to
* get the object variables using get_object_vars (which will only return public variables!)
* @param $data object The object to serialise.
* @param $n int Level, only used for recursion.
* @return string The serialised XML output.
*/
function serialise_object_to_xml($data, $name = "", $n = 0)
{
$classname = ($name=="" ? get_class($data) : $name);
$vars = method_exists($data, "export") ? get_object_vars($data->export()) : get_object_vars($data);
$output = "";
if (($n==0) || ( is_object($data) && !($data instanceof stdClass))) $output = "<$classname>";
foreach ($vars as $key => $value)
{
$output .= "<$key type=\"".gettype($value)."\">";
if (is_object($value))
$output .= serialise_object_to_xml($value, $key, $n+1);
else if (is_array($value))
$output .= serialise_array_to_xml($value, $n+1);
else
$output .= htmlentities($value);
$output .= "$key>\n";
}
if (($n==0) || ( is_object($data) && !($data instanceof stdClass))) $output .= "$classname>\n";
return $output;
}
/**
* Serialise an array.
*
* @param array $data
* @param int $n Used for recursion
* @return string
*/
function serialise_array_to_xml(array $data, $n = 0)
{
$output = "";
if ($n==0) $output = "\n";
foreach ($data as $key => $value)
{
$item = "array_item";
if (is_numeric($key))
$output .= "<$item name=\"$key\" type=\"".gettype($value)."\">";
else
{
$item = $key;
$output .= "<$item type=\"".gettype($value)."\">";
}
if (is_object($value))
$output .= serialise_object_to_xml($value, "", $n+1);
else if (is_array($value))
$output .= serialise_array_to_xml($value, $n+1);
else
$output .= htmlentities($value);
$output .= "$item>\n";
}
if ($n==0) $output = "\n";
return $output;
}
class ExportException extends Exception {}
class ImportException extends Exception {}
?>