Ben bir diziye 80 MB XML dosyası dönüştürme am () ve sürecinde RAM neredeyse 1 GB alır. Bu normal midir? Ben verimli bir kaynak olması ve satır satır dosyayı okur xml_parser kullanmayı deneyin, ama 1 GB gerçekten benim için sürpriz demek.
İşte kod:
class XmlToArray
{
protected $_stack = array();
protected $_file = "";
protected $_parser = null;
protected $_root = array();
public function __construct($file)
{
$this->_file = $file;
$this->_parser = xml_parser_create("UTF-8");
xml_set_object($this->_parser, $this);
xml_set_element_handler($this->_parser, "startTag", "endTag");
}
public function startTag($parser, $name, $attribs)
{
$new_node = array('name' => strtolower($name), 'attr' => $attribs, 'sub' => array());
$stack = $this->_stack;
$current = &$stack[count($stack) - 1];
if (is_array($current))
{
$current['s'][] = &$new_node;
}
else
{
$this->_root = &$new_node;
}
$this->_stack[] = &$new_node;
}
public function endTag($parser, $name)
{
array_pop($this->_stack);
}
public function convert()
{
$fh = fopen($this->_file, "r");
if (!$fh)
{
throw new Exception("fail");
}
while (!feof($fh))
{
$data = fread($fh, 4096);
xml_parse($this->_parser, $data, feof($fh));
}
return $this->_root;
}
}