2010-05-18 106 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

相關問題