none
dataset的getxml中的日期格式问题 RRS feed

  • 问题

  • 使用dataset的getxml方法,得到的日期类型是带TIMEZONE的。例如:    <kpsj>2011-01-01T00:00:00+08:00</kpsj>

    在xsd文件中定义的这个字段是日期类型xs:date的。我想xml得到正常的日期格式,例如2011-01-01,或者能指定格式的。有什么办法? 

               //使用包含定义的数据集来处理
                DataSet ds1 = new DataSet();
                ds1.ReadXmlSchema(txtXsdFile.Text); //读取架构文件
              
                //将数据复制到表中
                for(int i=0;i<ds.Tables[0].Rows.Count;i++)
                   ds1.Tables[0].ImportRow(ds.Tables[0].Rows[i]);    

            
                //显示数据       
                txtXML.Text = ds1.GetXml();


    2011年7月27日 6:45

答案

  • 不行的。关键问题在getxml的时候出了问题。datatable中就算是string类型,出来的时候也会被转换。

    这个原因是xsd文件中已经定义了该字段是xs:date类型。我想这里主要的问题是,现在的dataset对xs:date这个类型不能支持,根据w3c的规范,xs:date类型,应该是日期,不包含时间。但是这里不但包含时间,还用了带“T”的时间,更谈不上格式化。

    当然如果抛弃xsd文件的转换,收工另外处理肯定是有办法的。

    现在暂时只能修改xsd文件,将date类型改为string。然后查询数据的时候,将日期转换为nvarchar,提前格式化。

    我认为这很可能就是dataset的getxm对schema的支持不好。因为.net中只有datetime类型,而xs:date类型根本找不到对应的类型,而实现的时候就被粗暴的忽略掉了。

     

    • 已标记为答案 Paul Zhou 2011年8月4日 5:41
    2011年8月1日 5:24

全部回复

  • 有人知道么?还是不理解我的意思?
    2011年7月27日 7:46
  • 好像是个dataset的bug。。。郁闷
    2011年7月27日 8:51
  • 使用dataset的getxml方法,得到的日期类型是带TIMEZONE的。例如:    <kpsj>2011-01-01T00:00:00+08:00</kpsj>

    在xsd文件中定义的这个字段是日期类型xs:date的。我想xml得到正常的日期格式,例如2011-01-01,或者能指定格式的。有什么办法? 

               //使用包含定义的数据集来处理
                DataSet ds1 = new DataSet();
                ds1.ReadXmlSchema(txtXsdFile.Text); //读取架构文件
              
                //将数据复制到表中
                for(int i=0;i<ds.Tables[0].Rows.Count;i++)
                   ds1.Tables[0].ImportRow(ds.Tables[0].Rows[i]);    

            
                //显示数据       
                txtXML.Text = ds1.GetXml();


    简而言之,使用DataTable的RowChanged事件。


    namespace TestBed
    {

        public class MainTest
        {

            public static void Main()
            {

                DataTable dt = new DataTable();
                dt.Columns.Add("DateTime", typeof(DateTime));
                dt.RowChanged += new DataRowChangeEventHandler(dt_RowChanged);
                dt.Rows.Add("2011-01-01T00:00:00+08:00");
               
                //输出测试
                Console.WriteLine(dt.Rows[0][0].ToString());
     
            }

            static void dt_RowChanged(object sender, DataRowChangeEventArgs e)
            {
                //每次导入添加行,动态引发事件
                if (e.Action == DataRowAction.Add)
                {
                    e.Row["DateTime"] = DateTime.Parse(e.Row["DateTime"].ToString()).ToString("yyyy-MM-dd");
                }
            }

        }
    }


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年7月28日 5:09
    版主
  • 不行的。关键问题在getxml的时候出了问题。datatable中就算是string类型,出来的时候也会被转换。

    这个原因是xsd文件中已经定义了该字段是xs:date类型。我想这里主要的问题是,现在的dataset对xs:date这个类型不能支持,根据w3c的规范,xs:date类型,应该是日期,不包含时间。但是这里不但包含时间,还用了带“T”的时间,更谈不上格式化。

    当然如果抛弃xsd文件的转换,收工另外处理肯定是有办法的。

    现在暂时只能修改xsd文件,将date类型改为string。然后查询数据的时候,将日期转换为nvarchar,提前格式化。

    我认为这很可能就是dataset的getxm对schema的支持不好。因为.net中只有datetime类型,而xs:date类型根本找不到对应的类型,而实现的时候就被粗暴的忽略掉了。

     

    • 已标记为答案 Paul Zhou 2011年8月4日 5:41
    2011年8月1日 5:24