<?php
class XmlSerialize
{
var $m_iDepth;
var $m_oResult;
var $m_oCur;
var $m_oChild;
//это должен быть массив от depth
var $m_oParent;
var $m_parser;
function ObjToXml($obj, $attrs = array(), $depth = 0)
{
$varname = get_class($obj);
if(empty($varname))
$varname = gettype($obj);
$ret = str_repeat("\x9", $depth)."<$varname";
foreach($attrs as $key => $value)
$ret .= " $key=\"$value\"";
$ret .= ">\n";
$depth++;
foreach($obj as $key => $value)
{
if(gettype($value) == "object" || gettype($value) == "array")
{
if($varname == "array")
$ret .= XmlSerialize::ObjToXml($value, array("id" => $key), $depth);
else
$ret .= XmlSerialize::ObjToXml($value, array("name" => $key), $depth);
}
else
{
$type = gettype($value);
$ret .= str_repeat("\x9", $depth)."<$key>$value</$key>\n";
}
}
$depth--;
$ret .= str_repeat("\x9", $depth)."</$varname>\n";
return $ret;
}
function ObjToXmlFile($fname, $obj, $attrs = array(), $dept = 0, $head_xml = null, $tail_xml = null)
{
$fp = fopen($fname, "w");
fwrite($fp, "<?xml version=\"1.0\" ?>\n");
if($head_xml != null)
fwrite($fp, $head_xml);
fwrite($fp, XmlSerialize::ObjToXml($obj, $attrs, $dept));
if($tail_xml != null)
fwrite($fp, $tail_xml);
fclose($fp);
}
function XmlFileToObj($fname)
{
if(empty($this))
return null;
$fp = fopen($fname, "r");
$this->m_parser = xml_parser_create();
xml_set_object($this->m_parser, $this);
xml_set_element_handler($this->m_parser, "start_tag", "end_tag");
xml_set_character_data_handler($this->m_parser, "body_tag");
xml_parser_set_option($this->m_parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($this->m_parser, XML_OPTION_SKIP_WHITE, 1);
$this->m_iDepth = 0;
$this->m_oResult = null;
$this->m_oCur = &$this->m_oResult;
while ($data = fread($fp, 0x1000))
{
if (!xml_parse($this->m_parser, $data, feof($fp)))
{
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($this->m_parser)),
xml_get_current_line_number($this->m_parser)));
}
}
xml_parser_free($this->m_parser);
fclose($fp);
return $this->m_oResult;
}
//XML methods
function start_tag($parser, $name, $attrs)
{
switch($name)
{
case "ARRAY":
case "array":
if(!empty($attrs) && array_key_exists("name", $attrs))
{
$this->parser[$this->m_iDepth] = &$this->m_oCur;
$this->m_oCur = &$this->m_oCur->$attrs["name"];
}
else
$this->m_oCur = array();
break;
default:
if(!empty($attrs) && array_key_exists("id", $attrs))
{
$this->m_oCur[$attrs["id"]] = new $name;
$this->m_oParent[$this->m_iDepth] = &$this->m_oCur;
$this->m_oCur = &$this->m_oCur[$attrs["id"]];
}
else
{
if($this->m_iDepth == 0)
$this->m_oCur = new $name;
else
{
$this->m_oParent[$this->m_iDepth] = &$this->m_oCur;
$this->m_oCur = &$this->m_oCur->$name;
}
}
break;
}
$this->m_iDepth++;
}
function body_tag($parser, $data)
{
if(trim($data) != "")
$this->m_oCur = $data;
}
function end_tag($parser, $name)
{
$this->m_iDepth--;
$this->m_oCur = &$this->m_oParent[$this->m_iDepth];
}
};
?>