isEmptyElement == TRUE) return NULL; $ret = NULL; while ($xr->read () && ! ($xr->nodeType == 15 && $xr->name == 'variable')) { print "[DEBUG:xmlToVar] " . $xr->nodeType . " / " . $xr->name . " / " . $xr->value . "\n"; if ($xr->nodeType == 3 && $xr->hasValue == TRUE) $ret = $xr->value; } return $ret; } function xmlToArray ($xr) { $ret = array (); if ($xr->isEmptyElement == TRUE) return $ret; while ($xr->read () && ! ($xr->nodeType == 15 && $xr->name == 'array')) { print "[DEBUG:xmlToArray/1] " . $xr->nodeType . " / " . $xr->name . " / " . $xr->value . "\n"; if ($xr->nodeType == 1 && $xr->name == 'item') { $key = $xr->getAttribute ('key'); while ($xr->read () && ! ($xr->nodeType == 15 && $xr->name == 'item')) { print "[DEBUG:xmlToArray/2] " . $xr->nodeType . " / " . $xr->name . " / " . $xr->value . "\n"; if ($xr->nodeType == 1) { switch ($xr->name) { case 'variable': $ret[$key] = xmlToVar ($xr); $type = $xr->getAttribute ('type'); settype ($ret[$key], $type); break; case 'array': $ret[$key] = xmlToArray ($xr); break; case 'class': $class = $xr->getAttribute ('class'); $ret[$key] = new $class ($xr); } } } } } return $ret; } /* * native vars to xml stream */ function varToXml ($xw, $name, $val) { $xw->startElement ('variable'); if ($name !== NULL) $xw->writeAttribute ('name', $name); $xw->writeAttribute ('type', gettype ($val)); $xw->text ($val); $xw->endElement (); } function arrayToXml ($xw, $name, $arr) { $xw->startElement ('array'); if ($name !== NULL) $xw->writeAttribute ('name', $name); foreach ($arr as $key => $val) { $xw->startElement ('item'); $xw->writeAttribute ('key', $key); if (is_array ($val)) { arrayToXml ($xw, NULL, $val); } else if (is_object ($val)) { if (in_array ('toXml', get_class_methods ($val)) == TRUE) { $val->toXml ($xw); } } else { varToXml ($xw, NULL, $val); } $xw->endElement (); } $xw->endElement (); } function xmlify ($val) { $xw = new xmlWriter (); $xw->openMemory (); $xw->setIndent (TRUE); $xw->startDocument ('1.0', 'UTF-8'); if (is_array ($val)) { arrayToXml ($xw, NULL, $val); } else if (is_object ($val)) { if (in_array ('toXml', get_class_methods ($val)) == TRUE) { $val->toXml ($xw); } } else { varToXml ($xw, NULL, $val); } $res = $xw->outputMemory(TRUE); unset ($xw); return $res; } function deXmlify ($xmldata) { $ret = NULL; // print "
";
//	var_dump (str_replace (
//				array ("<", ">"), array ("<", ">") , $xmldata));
//	print "
"; // exit (1); $xr = new XMLReader (); $xr->XML ($xmldata); $xr->read (); switch ($xr->name) { case 'variable': $ret = xmlToVar ($xr); break; case 'array': $ret = xmlToArray ($xr); break; case 'class': $class = $xr->getAttribute ('class'); $ret = new $class ($xr); } $xr->close (); return $ret; } class c_xmlify { function __construct ($xr) { if ($xr->isEmptyElement == TRUE) return; while ($xr->read () && ! ($xr->nodeType == 15 && $xr->name == 'class')) { if ($xr->nodeType == 1) { $name = $xr->getAttribute ('name'); switch ($xr->name) { case 'variable': $this->$name = xmlToVar ($xr); $type = $xr->getAttribute ('type'); settype ($this->$name, $type); break; case 'array': $this->$name = xmlToArray ($xr); break; case 'class': $class = $xr->getAttribute ('class'); $this->$name = new $class ($xr); } } } } function toXml ($xw, $name = NULL) { $xw->startElement ('class'); if ($name !== NULL) $xw->writeAttribute ('name', $name); $xw->writeAttribute ('class', get_class ($this)); foreach (get_object_vars ($this) as $var => $val) { if (is_array ($val)) { arrayToXml ($xw, $var, $val); continue; } if (is_object ($val)) { if (in_array ('toXml', get_class_methods ($val)) == TRUE) { $val->toXml ($xw, $var); } continue; } varToXml ($xw, $var, $val); } $xw->endElement(); } }; ?>