XmlSerializer: строка '' не является допустимым значением AllXsd
Я получаю это сообщение: "Строка" 7/22/2006 12:00:00 AM "не является допустимым значением 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>
Ответы
Ответ 1
Я решил проблему, сохранив дату в строке, а затем создав геттер, который анализирует дату и возвращает ее как DateTime.
Пример кода:
[XmlElement("Valid")]
public string _Valid
{
get;
set;
}
[XmlIgnore]
public bool? Valid
{
get
{
if (!string.IsNullOrWhiteSpace(_Valid))
{
return bool.Parse(_Valid);
}
return null;
}
}
Ответ 2
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;
}
}
Ответ 3
Я понимаю, что это старый вопрос, но сегодня у меня была эта проблема, и я нашел обходное решение, использующее свойства и кастинг.
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?
.
Ответ 4
Попробуйте добавить атрибут IsNullable = true.
Ответ 5
Для тех, кто сталкивается с этим, это самый простой ответ, я столкнулся с той же проблемой, но не нуждался в нулевом значении 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; }
}