private static function parseInternal(XMLReader $reader, IDataGroup $group, $name = null) { /** @var IDataContainerManager */ $dataManager = $group->dataManager(); /** @var IDataGroupManager */ $groupManager = $group->groupManager(); while ($reader->read()) { if ($reader->nodeType == XMLReader::ELEMENT) { if ($name) { //echo ' +1 '.$reader->name."\n"; $item = new DataGroup(); self::parseInternal($reader, $item, $reader->name); $groupManager->add($name, $item); $name = null; //echo ' - '.$reader->name."\n"; } else { $name = $reader->localName; //echo ' +0 '.$name."\n"; } } elseif ($reader->nodeType == XMLReader::TEXT) { if ($name) { $value = trim($reader->value); if ($dataManager->has($name)) { $prevValue = $dataManager->get($name); if (!is_array($prevValue)) { $prevValue = array($prevValue); } array_push($prevValue, $value); $dataManager->set($name, $prevValue); //echo 'add '.$name.' = '.$value."\n"; } else { $dataManager->set($name, $value); //echo 'new '.$name.' = '.$value."\n"; } } } elseif ($reader->nodeType == XMLReader::END_ELEMENT) { if ($name) { //echo ' - '.$name."\n"; $name = null; } else { break; } } } }
private static function putArgumentToPlace(IDataGroup $group, $names, $value) { $name = array_shift($names); if (count($names)) { // group $index = (int) $name; /** @var IDataGroup */ $item = null; if ((string) $index == $name && $group instanceof IDataLevels) { /** @var IDataLevelsManager */ $levelsManager = $group->levelsManager(); if ($levelsManager->has($index)) { //echo " - level get($index) \r\n"; $item = $levelsManager->get($index); } else { //echo " - level new($index) \r\n"; $item = new DataGroup(); $levelsManager->set($index, $item); } } else { /** @var IDataGroupManager */ $groupManager = $group->groupManager(); if ($groupManager->has($name)) { //echo " - group get($name) \r\n"; $item = $groupManager->get($name); } else { //echo " - group new($name) \r\n"; $item = new DataGroup(); $groupManager->set($name, $item); $item = $groupManager->get($name); } } self::putArgumentToPlace($item, $names, $value); } else { // value /** @var IDataContainerManager */ $dataManager = $group->dataManager(); //echo " - value new($name) \r\n"; $dataManager->set($name, $value); } }