2010-05-18 101 views
16

我收到此消息时,“该字符串'7/22/2006 12:00:00 AM'不是有效的AllXsd值。”,在反序列化XML,元素包含日期,这是应该映射到元素的属性:XmlSerializer:字符串''不是有效的AllXsd值

[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> 
+2

请发布导致此问题的XML。如果可能,请将其缩小为仅包含一个“DateTime?”属性的示例。顺便说一句,注意'typeof(DateTime?)'与'typeof(DateTime)'不同。 – 2010-05-18 23:10:21

+0

嗨,我发布了XML,感谢您的帮助。 – ryudice 2010-05-19 15:13:39

回答

15

我通过将日期存储在字符串中,然后创建一个分析日期并将其作为DateTime返回的getter来解决该问题。

样品的编号:

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

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

      return null; 
     } 
    } 
+0

有关此问题的更多信息,请参见http://stackoverflow.com/a/661898/288747回答 – Seph 2012-01-04 12:22:56

+2

@ryudice,您自己的代码是用来解决问题的? – burhan 2014-03-12 23:09:52

2

尝试增加 “ISNULLABLE = true” 属性。

10

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; 
     } 
    } 
+0

让我走向正确的方向!在我的代码中,我不想要一个可为空的类型,所以'DateTime.Parse'(用在我自己的代码中)会在序列化失败时抛出异常。 – 2017-02-15 09:45:03

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 

它的工作原理的确切方式与以前的实现相同,除了铸造和null检查出现在不同的位置。我希望能够编写我的模型,然后忘记它,所以我仍然更喜欢我的实现。

另一方面,我在编辑之前添加了对演员的更正:DateTime应该是DateTime?

+1

如果使用正确,它会起作用。但是,优雅是一个不同的问题,我不会这么称呼它。编写合适的代码很容易,但在运行时抛出异常,因为属性的类型是“object”。如果'_date'包含一个有效的字符串,那么即使是一个无辜的'obj.Date = obj.Date;'也会抛出异常。至少'(字符串)值'必须被替换'value.ToString()'(带有空检查)。 – Dirk 2014-03-01 16:52:36

+0

我会确保将来使用“*优雅”这个词。 – dimiguel 2014-03-01 19:26:46

1

对于那些遇到这里的人是最简单的答案,我遇到了同样的问题,但并不需要可空的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; } 
} 
+0

问题是关于反序列化。 – 2017-08-03 12:28:43

相关问题