XmlSerializer: строка '' не является допустимым значением AllXsd - PullRequest
19 голосов
/ 19 мая 2010

Я получаю это сообщение: «Строка« 22.07.2006, 12:00:00 »не является допустимым значением AllXsd». При десериализации XML элемент содержит дату, это свойство который должен быть сопоставлен с элементом:

[XmlElement("FEC_INICIO_REL",typeof(DateTime))]
public DateTime? FechaInicioRelacion { get; set; }

Я что-то не так делаю?

UPDATE: Вот XML:

<Detalle>
  <NOM_ASOC>Financiera Panameña</NOM_ASOC>
  <DESCR_CORTA_RELA>PREST. PERSONAL</DESCR_CORTA_RELA>
  <FEC_INICIO_REL>7/22/2006 12:00:00 AM</FEC_INICIO_REL>
  <FEC_FIN_REL>9/22/2008 12:00:00 AM</FEC_FIN_REL>
  <MONTO_ORIGINAL>1160.0000</MONTO_ORIGINAL>
  <NUM_PAGOS>2</NUM_PAGOS>
  <DESCR_FORMA_PAGO>PAGOS VOLUNTARIOS</DESCR_FORMA_PAGO>
  <IMPORTE_PAGO>59.9400</IMPORTE_PAGO>
  <FEC_ULTIMO_PAGO>11/15/2006 12:00:00 AM</FEC_ULTIMO_PAGO>
  <MONTO_ULTIMO_PAGO>0.0000</MONTO_ULTIMO_PAGO>
  <DESCR_OBS_CORTA />
  <SALDO_ACTUAL>1078.3900</SALDO_ACTUAL>
  <NUM_DIAS_ATRASO>0</NUM_DIAS_ATRASO>
  <HISTORIA>1</HISTORIA>
  <MONTO_CODIFICADO />
  <FEC_ACTUALIZACION>10/17/2008 12:00:00 AM</FEC_ACTUALIZACION>
  <COD_GRUPO_ECON>  </COD_GRUPO_ECON>
  <TIPO_ASOC>  </TIPO_ASOC>
  <NUM_REFER>2008628116</NUM_REFER>
</Detalle>

Ответы [ 5 ]

18 голосов
/ 25 мая 2010

Я решил проблему, сохранив дату в строке, а затем создал метод получения, который анализирует дату и возвращает ее как DateTime.

Пример кода:

    [XmlElement("Valid")]
    public string _Valid
    {
        get;
        set;
    }

    [XmlIgnore]
    public bool? Valid
    {
        get
        {
            if (!string.IsNullOrWhiteSpace(_Valid))
            {
                return bool.Parse(_Valid);
            }

            return null;
        }
    }
11 голосов
/ 19 марта 2012

AllocationDate является обязательным полем, но может быть предоставлено как пустое поле, которое обрабатывается путем представления его с помощью AllocationDateString:

    private DateTime? _allocationDate;

    [XmlIgnore]
    public DateTime? AllocationDate
    {
        get { return _allocationDate; }
        set { _allocationDate = value; }
    }

    [XmlAttribute("AllocationDateTime")]
    public string AllocationDateTimeString
    {
        get
        {
            return _allocationDate.HasValue ? XmlConvert.ToString(_allocationDate.Value, XmlDateTimeSerializationMode.Unspecified)
            : string.Empty;
        }
        set
        {
            _allocationDate = !string.IsNullOrEmpty(value) ? XmlConvert.ToDateTime(value, XmlDateTimeSerializationMode.Unspecified) : (DateTime?)null;
        }
    }
4 голосов
/ 11 февраля 2014

Я понимаю, что это старый вопрос, но у меня была эта проблема сегодня, и я нашел обходной путь, используя свойства и приведение.

private string _date; // Private variable to store XML string

// Property that exposes date. Specifying the type forces
// the serializer to return the value as a string.
[XmlElement("date", Type = typeof(string))]
public object Date {
    // Return a DateTime object
    get
    {
        return
            !string.IsNullOrEmpty(_date) ? 
            (DateTime?) Convert.ToDateTime(_date) : 
            null;
    }
    set { _date = (string)value; } 
}

Теперь, когда вам нужно обратиться к дате, вы просто звоните:

var foo = (DateTime?)Bar.Date

С тех пор у меня все работает нормально. Если вы не возражаете против добавления дополнительного кода в свой код, вы можете сделать это и так!

Редактировать: Из-за комментария Дирка я решил вернуться к своей реализации в отдельной ветке. Вместо использования класса object, который подвержен ошибкам компилятора во время выполнения, я возвращаю значение в виде строки.

[XmlElement("date")] 
public string Date;

Что делает объявление намного проще. Но при попытке чтения из переменной вам необходимо предоставить нулевые проверки.

var foo = string.IsNullOrEmpty(Date) ? Convert.ToDateTime(Date) : (DateTime?) null

Он работает точно так же, как и в предыдущей реализации, за исключением того, что проверки приведения и проверки нуля происходят в другом месте. Я хочу написать свою модель, а потом забыть об этом, поэтому я все же предпочитаю свою реализацию вместо этого.

В другой заметке я добавил исправление в приведение перед редактированием: DateTime должно быть DateTime?.

2 голосов
/ 18 июля 2016

Для тех, кто сталкивается с этим здесь - самый простой ответ, я столкнулся с той же проблемой, но не нуждался в сворачиваемом DateTime. Элемент XMLElement требуется только для получения, а не для набора при рендеринге XML.

private DateTime _fechaInicioRelacion;

[XmlElement("FEC_INICIO_REL")]
public string FechaInicioRelacionString
{
    get
        {
            return _fechaInicioRelacion.ToString("yyyy-MM-ddTHH:mm:ss");
        }
    set { }
}

[XmlIgnore]
public DateTime FechaInicioRelacion
{
    get { return _fechaInicioRelacion; }
    set { _fechaInicioRelacion = value; }
}
1 голос
/ 19 мая 2010

Попробуйте добавить атрибут «IsNullable = true».

...