2009-08-10 48 views
2

如果我有下面的XML片段:如何反序列化DateTime對象列表?

<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作爲類型而不是字符串(無論是列表類型和XmlArrayItem型),我得到的以下錯誤:

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

謝謝!

+0

再評論 - 是的,你可以序列化/如果數據是在自動反序列化正確的格式;請參閱更新。 – 2009-08-10 23:20:09

回答

5

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

+1謝謝!如果這是問題,那麼我可能會包含一個XML註釋,明確指出這一點。我不認爲這些價值觀會經常改變(如果有的話)。在.NET中是否存在內置機制,用於將XML元素值反序列化爲DateTime對象,而不使用您提供的格式(即可能是我提供的轉換器類)? – Pwninstein 2009-08-10 22:18:28

+0

因爲我只對時間(而不是日期)感興趣,所以我現在使用xsd:time。有效時間顯示在此頁面的底部:http://books.xmlschemata.org/relaxng/ch19-77311.html,並且可以反序列化爲.NET DateTime對象。你提供的例子是有幫助的。謝謝! – Pwninstein 2009-08-11 15:41:04

0

看看MSDN文章: http://msdn.microsoft.com/en-us/library/ms950721.aspx

它表明DateTime對象應標因此: [System.Xml.Serialization.XmlElementAttribute(「publication-date」, DataType =「date」)]
public System.DateTime publicationdate;

+0

在我的代碼單個'DateTime'不是一個問題只'列表' – 2016-05-16 19:30:31

3

最簡單的方法是創建序列化,而不是時代特性的新屬性,並處理格式:

[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

任何想法爲什麼這隻與'CultureInfo.InvariantCulture'和'ParseExact'一起工作,而不是'CultureInfo.InvariantCulture'和「普通」'Parse' ? – 2016-05-16 19:27:46