@Nullable
  private static PListValue readBasicValue(@NotNull String type, @NotNull XmlElement valueElement) throws IOException {
    String content = valueElement.content;

    if ("string".equals(type) && content != null) {
      return value(Strings.unescapeXmlEntities(content), PlistValueType.STRING);
    }
    else if ("true".equals(type)) {
      return value(Boolean.TRUE, PlistValueType.BOOLEAN);
    }
    else if ("false".equals(type)) {
      return value(Boolean.FALSE, PlistValueType.BOOLEAN);
    }
    else if ("integer".equals(type) && content != null) {
      return value(Integer.parseInt(content), PlistValueType.INTEGER);
    }
    else if ("real".equals(type) && content != null) {
      return value(Double.parseDouble(content), PlistValueType.REAL);
    }
    else if ("date".equals(type) && content != null) {
      try {
        return value(Plist.dateFormatter().parse(content), PlistValueType.DATE);
      }
      catch (ParseException e) {
        throw new IOException(e);
      }
    }
    return null;
  }
@Nullable
  private static PListValue readBasicValue(@NotNull String type, @NotNull XmlElement valueElement)