2010-05-18 28 views
16

Ricevo questo messaggio, "La stringa '7/22/2006 12:00:00 AM' non è un valore AllXsd valido.", Quando deserializza un XML, l'elemento contiene una data, questa è la proprietà che dovrebbe essere mappato all'elemento:XmlSerializer: la stringa '' non è un valore AllXsd valido

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

sto facendo qualcosa di sbagliato?

UPDATE: Ecco l'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

Si prega di inviare l'XML che causa questo problema. Se possibile, riduci questo valore ad un esempio che ha solo una singola proprietà 'DateTime?'. A proposito, si noti che 'typeof (DateTime?)' Non è la stessa cosa di 'typeof (DateTime)'. –

+0

Ciao, ho pubblicato l'XML, grazie per il tuo aiuto. – ryudice

risposta

15

Ho risolto il problema memorizzando la data nella stringa e quindi creando un getter che analizza la data e la restituisce come DateTime. codice

Esempio:

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

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

      return null; 
     } 
    } 
+0

Vedere la risposta all'indirizzo http://stackoverflow.com/a/661898/288747 per maggiori informazioni su questo numero – Seph

+2

@ryudice, qual è il tuo codice per risolvere il problema? – burhan

2

Prova ad aggiungere "IsNullable = true" attributo.

10

AllocationDate è un campo obbligatorio, ma può essere fornito come vuoto che è gestito da rappresentando dal 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

Mi ha portato nella giusta direzione! Nel mio codice non voglio un tipo nullable, quindi il 'DateTime.Parse' (usato nel mio codice) genererà un'eccezione se la serializzazione fallisce. –

3

mi rendo conto che questa è una vecchia questione, ma ho avuto questo problema oggi e ho trovato una soluzione alternativa usando proprietà e casting.

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

Ora, ogni volta che è necessario fare riferimento alla data, si chiama semplicemente:

var foo = (DateTime?)Bar.Date 

Si sta lavorando bene per me da allora. Se non ti dispiace aggiungere il cast extra nel tuo codice, puoi farlo anche in questo modo!

Modifica: A causa del commento di Dirk, ho deciso di rivisitare la mia implementazione in un ramo separato. Anziché utilizzare una classe object, che è soggetta agli errori del compilatore di runtime, restituisco il valore sotto forma di stringa.

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

Ciò rende la dichiarazione molto più semplice. Ma quando si tenta di leggere dalla variabile ora è necessario fornire assegni nulli.

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

Funziona esattamente allo stesso modo come l'attuazione precedente, ad eccezione del controlli nulli colata e si verificano in una posizione diversa. Voglio poter scrivere il mio modello e poi dimenticarlo, quindi preferisco comunque la mia implementazione.

In un'altra nota, ho aggiunto una correzione al cast prima della modifica: DateTime deve essere DateTime?.

+1

Funziona se usato correttamente. Ma se è elegante è una domanda diversa e non la chiamerei così. È troppo facile scrivere codice che compila bene ma genera un'eccezione in fase di esecuzione perché il tipo di proprietà è 'object'. Se '_date' contiene una stringa valida, anche un innocente' obj.Date = obj.Date; 'genererà ed eccezione. Per lo meno il valore '(stringa)' dovrebbe essere sostituito da' value.ToString() '(con un controllo null). – Dirk

+0

Mi assicurerò di usare la parola * elegante * leggermente in futuro. – dimiguel

1

Per coloro che incontrano questo qui è la risposta più semplice, mi sono imbattuto nello stesso problema, ma non avevo bisogno di DateTime nullable. XMLElement ha bisogno solo di ottenere non un set durante il rendering di 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; } 
} 
+0

La domanda riguardava la deserializzazione. –

Problemi correlati