2010-02-09 4 views
1

J'ai une chaîne XML qui contient des dates formatées "jj/mm/aaaa hh: mm: ss".Comment obtenir DataSet.ReadXml pour analyser un attribut DateTime en tant que typé DateTime

Je charge ce code XML dans un ensemble de données en utilisant DataSet.ReadXml().

Comment puis-je m'assurer que cette date est stockée dans le DataSet en tant que DateTime tapé afin que je puisse Trier, Format et RowFilter en conséquence.

Mon harnais de test est comme ci-dessous:

ASPX Page:

<%@ 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> 

code Derrière:

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

Répondre

1

Ceci est douloureux, mais la racine du problème est que vos données XML ne peuvent pas être fortement typé dans ce cas car le format de date n'est pas au format xs:date et vous ne pouvez pas changer le type une fois que les données sont dans l'ensemble de données. En outre compliquer les choses est que .NET wont format automatique "28/01/2010 00:00:00" comme une date. Donc, juste une copie d'une table de données à l'autre avec le bon type de données et en reformatant la chaîne de date en cours de route. Ce code fonctionne, mais il est loin d'être élégant. Bonne chance.

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

Que voulez-vous dire que XML ne peut pas être fortement typé? Le problème est que vos données XML ne contiennent pas de date valide. Il y a précisément une représentation des dates en XML, et ce n'est pas ça. Recherchez le format 'xs: Date' dans le schéma XML si vous souhaitez que vos chaînes soient considérées comme des dates par des outils qui attendent que XML suive les normes XML. –

+0

Ok, je vais mettre à jour ma réponse, vous pouvez taper des dates xml mais pas dans l'exemple car la date est dans un format impair. C'est une date valide (c'est la norme au Royaume-Uni), mais pas une date valide par schéma XML. – nbushnell

+0

Merci pour votre réponse, cela a aidé. À la fin, j'ai effectivement converti la date dans le format correct en utilisant la manipulation de chaînes dans un xslt, puis chargé un xsd afin de dire à l'ensemble de données qu'il s'agissait d'une date. –

Questions connexes