2010-02-09 79 views
1

我有一个XML字符串,其中包含格式为“dd/MM/yyyy hh:mm:ss”的日期。如何获取DataSet.ReadXml来解析DateTime属性作为类型DateTime

我使用DataSet.ReadXml()将此XML加载到数据集中。

如何确保将此日期作为类型化的DateTime存储在DataSet中,以便相应地对其进行排序,格式化和RowFilter。

我的测试工具是如下:

ASPX页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="XmlDateTypeList.aspx.cs" Inherits="Test.XmlDateTypeList" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>Test</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:GridView ID="GridView1" AutoGenerateColumns="false" runat="server"> 
      <Columns> 
       <asp:BoundField DataField="Name" HeaderText="Name" /> 
       <asp:BoundField DataField="Date" HeaderText="Date" DataFormatString="{0:dddd dd MMMM yyyy}" /> 
      </Columns> 
     </asp:GridView> 
    </div> 
    </form> 
</body> 
</html> 

代码背后:

using System; 
using System.Data; 
using System.IO; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Xml.Linq; 

namespace Test 
{ 
    public partial class XmlDateTypeList : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      XDocument xDoc = new XDocument(
       new XElement("List", 
        new XElement("Item", 
         new XAttribute("Name", "A"), 
         new XAttribute("Date", "21/01/2010 00:00:00") 
        ), 
        new XElement("Item", 
         new XAttribute("Name", "B"), 
         new XAttribute("Date", "12/01/2010 00:00:00") 
        ), 
        new XElement("Item", 
         new XAttribute("Name", "C"), 
         new XAttribute("Date", "10/01/2010 00:00:00") 
        ), 
        new XElement("Item", 
         new XAttribute("Name", "D"), 
         new XAttribute("Date", "28/01/2010 00:00:00") 
        ) 
       ) 
      ); 

      DataSet dataSet = new DataSet(); 
      dataSet.ReadXml(new StringReader(xDoc.ToString())); 

      GridView1.DataSource = dataSet.Tables[0]; 
      GridView1.DataBind(); 
     } 
    } 
} 

回答

1

这是痛苦的,但根本的问题是,你的XML数据不能在这种情况下是强类型的,因为日期格式不是xs:date格式,并且一旦数据在数据集中就不能更改类型。更复杂的事情是,.NET不会自动格式化“28/01/2010 00:00:00”作为日期。所以,只需从一个数据表复制到另一个具有正确数据类型的副本,并重新格式化日期字符串。此代码有效,但远不够优雅。祝你好运。

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using System.Web.UI; 
    using System.Web.UI.WebControls; 
    using System.Xml.Linq; 
    using System.Data; 
    using System.IO; 

    public partial class xmltest : System.Web.UI.Page 
    { 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      XDocument xDoc = new XDocument(
       new XElement("List", 
        new XElement("Item", 
         new XAttribute("Name", "A"), 
         new XAttribute("Date", "21/01/2010 00:00:00") 
        ), 
        new XElement("Item", 
         new XAttribute("Name", "B"), 
         new XAttribute("Date", "12/01/2010 00:00:00") 
        ), 
        new XElement("Item", 
         new XAttribute("Name", "C"), 
         new XAttribute("Date", "10/01/2010 00:00:00") 
        ), 
        new XElement("Item", 
         new XAttribute("Name", "D"), 
         new XAttribute("Date", "28/01/2010 12:33:22") 
        ) 
       ) 
      ); 

      DataSet dataSet = new DataSet(); 
      dataSet.ReadXml(new StringReader(xDoc.ToString())); 

      DataSet dataSet2 = dataSet.Clone(); 

      dataSet2.Tables[0].Columns[1].DataType = typeof(DateTime); 

      // painful, painful copy over code from dataset1 to dataset2 
      foreach (DataRow r in dataSet.Tables[0].Rows) 
      { 

       DataRow newRow = dataSet2.Tables[0].NewRow(); 
       newRow["name"] = r["name"]; 

       newRow["Date"] = DateTime.ParseExact(r["Date"].ToString(), "dd/MM/yyyy HH:mm:ss", CultureInfo.CurrentCulture); 

       dataSet2.Tables[0].Rows.Add(newRow); 

      } 

      GridView1.DataSource = dataSet2.Tables[0]; 
      GridView1.DataBind(); 
     } 
    } 
+0

你是什么意思,XML不能强类型?问题是您的XML数据不包含有效的日期。 XML中只有一种日期表示形式,但事实并非如此。如果您希望将XML字符串视为符合XML标准的工具,那么请在XML Schema中查找'xs:Date'格式。 – 2010-02-23 23:27:42

+0

好吧,我会更新我的答案,您可以键入xml日期,但不会在该示例中,因为日期格式为奇数。这是一个有效的日期(这在英国是标准的),而不是每个XML模式的有效日期。 – nbushnell 2010-02-24 15:19:03

+0

感谢您的回答,它有所帮助。最后,我实际上使用xslt中的字符串操作将日期转换为正确的格式,然后加载xsd以便告诉数据集它是日期。 – 2010-02-25 07:45:58