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);
     }
 }