我收到此消息,“字符串'7/22/2006 12:00:00 AM'不是有效的AllXsd值。”,在反序列化XML时,该元素包含一个日期,这是属性应该映射到元素:
[XmlElement("FEC_INICIO_REL",typeof(DateTime))]
public DateTime? FechaInicioRelacion { get; set; }
我做错了吗?
更新: 这是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>
答案 0 :(得分:18)
我通过将日期存储在字符串中然后创建一个解析日期并将其作为DateTime返回的getter解决了这个问题。
示例代码:
[XmlElement("Valid")]
public string _Valid
{
get;
set;
}
[XmlIgnore]
public bool? Valid
{
get
{
if (!string.IsNullOrWhiteSpace(_Valid))
{
return bool.Parse(_Valid);
}
return null;
}
}
答案 1 :(得分:11)
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;
}
}
答案 2 :(得分:4)
我意识到这是一个老问题,但我今天遇到了这个问题,我找到了使用属性和强制转换的解决方法。
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
从那以后它一直很好用。如果您不介意在代码中添加额外的强制转换,您也可以这样做!
编辑:由于Dirk的评论,我决定在一个单独的分支中重新审视我的实施。我不是使用容易出现运行时编译器错误的object
类,而是将值作为字符串返回。
[XmlElement("date")]
public string Date;
这使声明变得更加简单。但是当尝试从变量中读取时,您现在需要提供空检查。
var foo = string.IsNullOrEmpty(Date) ? Convert.ToDateTime(Date) : (DateTime?) null
它的工作方式与上一个实现完全相同,只是在另一个位置进行转换和空检查。我希望能够编写我的模型然后忘记它,所以我仍然更喜欢我的实现。
另一方面,我在编辑前为演员添加了更正:DateTime
应为DateTime?
。
答案 3 :(得分:2)
对于那些遇到这个问题的人来说,这是最简单的答案,我遇到了同样的问题,但并不需要可以为空的DateTime。在渲染XML时,XMLElement只需要get而不是set。
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; }
}
答案 4 :(得分:1)
尝试添加“IsNullable = true”属性。