code: public static function getXMLElementValue(SimpleXMLElement $element, string $forceType = NULL, bool $forceAll = false) {
          $normalize = function(SimpleXMLElement $element, $forced) use (&$normalize, $forceAll) {
              $type = (string) ($element['type'] ?? 'string');
              if($forced)
                  $type = $forced;
  
              if($type == 'list') {
                  $list = [];
                  foreach($element->children() as $child) {
                      $key = (string)$child["key"];
                      $value = $normalize($child, $forceAll ? $forced : "");
  
                      if($key)
                          $list[$key] = $value;
                      else
                          $list[] = $value;
                  }
                  return $list;
              }
  
              $value = (string) $element;
              switch ($type) {
                  case 'int': return (int) $value;
                  case 'float': return (float) $value;
                  case 'bool': return (bool) $value;
                  default: break;
              }
              return $value;
          };
  
          return $normalize($element, $forceType);
      }
docs: Unpacks an XML element into a value <... type="string|int|bool|float|list">....</...>
  While the type list expects children like <item key="a key">...</item>
  
  @param \SimpleXMLElement $element
  @return bool|float|int|string|array