2010-02-09 1 views
1

날짜가 "dd/MM/yyyy hh : mm : ss"형식의 XML 문자열이 있습니다.DataSet.ReadXml을 사용하여 DateTime 특성을 형식화 된 DateTime으로 구문 분석하는 방법

DataSet.ReadXml()을 사용하여이 XML을 데이터 세트에로드하고 있습니다.

어떻게이 날짜를 DataSet에 형식화 된 DateTime으로 저장하여 그에 따라 Sort, Format 및 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 스키마에서'xs : Date' 형식을 찾습니다. –

+0

그래, 내 답변을 업데이 트됩니다, 당신은 xml 날짜를 입력 할 수 있지만 날짜가 이상한 형식이기 때문에 예제에 없습니다. XML 스키마 당 유효한 날짜가 아닌 유효한 날짜입니다 (영국 표준). – nbushnell

+0

답변 해 주셔서 감사합니다. 결국 실제로 xslt에서 문자열 조작을 사용하여 올바른 형식으로 날짜를 변환 한 다음 데이터 세트에 날짜라고 알리기 위해 xsd를로드했습니다. –