code: @SuppressWarnings("unchecked")
      private void setValue(List<Element> elements, String attrName, Object pojo,
                            CustomPropertyDescriptor field) {
          XmlNode attrXmlNode = field.getAnnotation(XmlNode.class);
          log.debug("要赋值的fieldName为{}", field.getName());
          final XmlTypeConvert convert = XmlTypeConverterUtil.resolve(attrXmlNode, field);
  
          Class<? extends Collection> collectionClass;
          Class<? extends Collection> real = (Class<? extends Collection>) field.getRealType();
  
          if (attrXmlNode != null) {
              collectionClass = attrXmlNode.arrayType();
              if (!collectionClass.equals(real) && !real.isAssignableFrom(collectionClass)) {
                  log.warn("用户指定的集合类型[{}]不是字段的实际集合类型[{}]的子类，使用字段的实际集合类型", collectionClass, real);
                  collectionClass = real;
              }
          } else {
              collectionClass = real;
          }
  
          if (!StringUtils.isEmpty(attrXmlNode.arrayRoot()) && !elements.isEmpty()) {
              elements = elements.get(0).elements(attrXmlNode.arrayRoot());
          }
  
          //将数据转换为用户指定数据
          List<?> list = elements.stream().map(d -> convert.read(d, attrName))
              .collect(Collectors.toList());
  
          if (!trySetValue(list, pojo, field, collectionClass)) {
              //使用注解标记的类型赋值失败并且注解的集合类型与实际字段类型不符时尝试使用字段实际类型赋值
              if (!trySetValue(list, pojo, field, real)) {
                  log.warn("无法为字段[{}]赋值", field.getName());
              }
          }
      }
docs: 往pojo中指定字段设置值（字段为Collection类型）
  
  @param elements 要设置的数据节点
  @param attrName 要获取的属性名，如果该值不为空则认为数据需要从属性中取而不是从节点数据中取
  @param pojo     pojo
  @param field    字段说明