Как я могу десериализовать список объектов DateTime? - PullRequest
2 голосов
/ 11 августа 2009

Если у меня есть следующий сегмент XML:

<Times>
  <Time>1/1/1900 12:00 AM</Time>
  <Time>1/1/1900 6:00 AM</Time>
</Times>

Как должно выглядеть соответствующее свойство, когда при десериализации происходит принятие вышеуказанного XML в список объектов DateTime?

Это работает для десериализации сегмента XML в список string объектов:

[XmlArray("Times")]
[XmlArrayItem("Time", typeof(string))]
public List<string> Times { get; set; }

Но когда я использую DateTime в качестве типа вместо строки (для типа List и типа XmlArrayItem), я получаю следующую ошибку:

The string '1/1/1900 12:00 AM' is not a valid AllXsd value.

Спасибо!

Ответы [ 3 ]

5 голосов
/ 11 августа 2009

С DateTime я ожидаю, что большая часть проблемы заключается в неправильном формате xml; это не стандарт XSD для дат ... Вы можете повлиять на XML вообще? В противном случае вам, возможно, придется придерживаться строк и обрабатывать их впоследствии.

Более стандартный XML будет:

<Times>
  <Time>1900-01-01T00:00:00</Time>
  <Time>1900-01-01T06:00:00</Time>
</Times>

Например:

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
public class Data
{

    [XmlArray("Times")]
    [XmlArrayItem("Time")]
    public List<DateTime> Times { get; set; }

    static void Main()
    {
        XmlReader xr = XmlReader.Create(new StringReader(@"<Data><Times>
  <Time>1900-01-01T00:00:00</Time>
  <Time>1900-01-01T06:00:00</Time>
</Times></Data>"));
        XmlSerializer ser = new XmlSerializer(typeof(Data));
        Data data = (Data) ser.Deserialize(xr);
        // use data
    }
}
3 голосов
/ 11 августа 2009

Самый простой способ - создать новое свойство, которое сериализуется вместо свойства Times и обрабатывает форматирование:

    [XmlIgnore]
    public IList<DateTime> Times { get; set; }

    [XmlArray("Times")]
    [XmlArrayItem("Time")]
    public string[] TimesFormatted
    {
        get
        {
            if (this.Times != null)
                return this.Times.Select((dt) => dt.ToString("MM/dd/yyyy hh:mm tt", CultureInfo.InvariantCulture)).ToArray();
            else
                return null;
        }
        set
        {
            if (value == null)
                this.Times = new List<DateTime>();
            else
                this.Times = value.Select((s) => DateTime.ParseExact(s, "MM/dd/yyyy hh:mm tt", CultureInfo.InvariantCulture)).ToList();
        }
    }
0 голосов
/ 11 августа 2009

Взгляните на статью MSDN: http://msdn.microsoft.com/en-us/library/ms950721.aspx

Предполагается, что объект DateTime должен быть помечен так: [System.Xml.Serialization.XmlElementAttribute ( "Дата опубликования", DataType = "Дата")]
public System.DateTime публикацииdate;

...