Linq To XML 查询,并转换为Datatable

5 篇文章 0 订阅
1 篇文章 0 订阅

查询的xml

<?xml version="1.0" encoding="utf-8"?>
<ClassMembers>
  <StudentInfo ClassID="2" OrderNumber="10" StudentNumber="1027345953" StudentName="Tom">
    <SumTime>2</SumTime>
    <Percent>0</Percent>
    <AbsenceTime>0</AbsenceTime>
    <Day2013-04-25>出勤</Day2013-04-25>
    <Day2013-04-24>出勤</Day2013-04-24>
  </StudentInfo>
  <StudentInfo ClassID="2" OrderNumber="9" StudentNumber="1027344755" StudentName="Joy">
    <SumTime>2</SumTime>
    <Percent>0</Percent>
    <AbsenceTime>1</AbsenceTime>
    <Day2013-04-25>出勤</Day2013-04-25>
    <Day2013-04-24>缺勤</Day2013-04-24>
  </StudentInfo>

</ClassMembers>


第一种方法:

string path = xmlpath+classname + ".xml";
            XElement root = XElement.Load(path);
           
            //第一种方法
            DataSet ds = new DataSet();
            ds.ReadXml(path);
            DataTable table = ds.Tables[0];
            var students = from student in table.AsEnumerable() select new { name = student.Field<string>("StudentName"), number = student.Field<string>("StudentNumber") };              DataGridView d = new DataGridView();
            d.DataSource = students;
            d.AutoGenerateColumns = false;
            //通过设置AutoGenerateColumns属性使不自动生成列,直接绑定Datagridview。

第二种方法 (需要新建类来投影查询的结果) 


StudentInfo类

class StudentInfo

    {
        private string StudentName;
        private string StudentNumber;
        private string SumTime;
        private string AbsenceTime;       
        private int CourseID;
        private int OrderNumber;
        public string studentName
        {
            get { return StudentName; }
            set { StudentName = value; }
        }
        public string studentNumber
        {
            get { return StudentNumber; }
            set { StudentNumber = value; }
        }
        public string sumTime
        {
            get { return SumTime; }
            set { SumTime = value; }
        }
        public string absenceTime
        {
            get { return AbsenceTime; }
            set { AbsenceTime = value; }
        }
        public int courseID
        {
            get { return CourseID; }
            set { CourseID = value; }
        }
        public int orderNumber
        {
            get { return OrderNumber; }
            set { OrderNumber = value; }
        }
        public StudentInfo(string studentName,
                           string studentNumber,
                           string sumTime,
                           string absenceTime,
                           int courseID,
                           int orderNumber)
        {
            StudentNumber = studentNumber;
            StudentName = studentName;
            SumTime = sumTime;
            AbsenceTime = absenceTime;
            CourseID = courseID;
            OrderNumber = orderNumber;
        }    


    }
 
IEnumerable<StudentInfo> result = from student in root.Elements("StudentInfo")
                                              select new StudentInfo(
                                                 student.Attribute("StudentName").Value,
                                                 student.Attribute("StudentNumber").Value,
                                                 student.Element("SumTime").Value,
                                                 student.Element("AbsenceTime").Value,
                                                 Convert.ToInt32(student.Attribute("ClassID").Value),
                                                 Convert.ToInt32(student.Attribute("OrderNumber").Value)
                                                 );//查询班级成员的姓名,学号
            DataTable myOrders = CopyToDataTable<StudentInfo>(result);
 /// <summary>
        /// 转换DataTable
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <param name="array"></param>
        /// <returns></returns>
        public static DataTable CopyToDataTable<T>(IEnumerable<T> array)
        {
            var ret = new DataTable();
            foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T)))
                ret.Columns.Add(dp.Name, dp.PropertyType);
            foreach (T item in array)
            {
                var Row = ret.NewRow();
                foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T)))
                    Row[dp.Name] = dp.GetValue(item);
                ret.Rows.Add(Row);
            }
           


第三种方法


var students = from student in root.Elements("StudentInfo").AsEnumerable()
                           select new
                           {
                               Name = student.Attribute("StudentName").Value,
                               Number = student.Attribute("StudentNumber").Value,
                               CourseId = student.Attribute("CourseId").Value,
                               OrderNumber = student.Attribute("OrderNumber").Value,
                               SumTime = student.Element("SumTime").Value,
                               AbsenceTime = student.Element("AbsenceTime").Value
                           };

            DataTable myOrders = new DataTable();
            myOrders.Columns.Add("StudentNumber", typeof(string));
            myOrders.Columns.Add("StudentName", typeof(string));
            myOrders.Columns.Add("CourseId", typeof(int));
            myOrders.Columns.Add("OrderNumber", typeof(int));
            myOrders.Columns.Add("SumTime", typeof(string));
            myOrders.Columns.Add("AbsenceTime", typeof(string));
            foreach (var result in students)
            {
                myOrders.Rows.Add(new object[] { result.Name, result.Number, Convert.ToInt32(result.CourseId), Convert.ToInt32(result.OrderNumber), result.SumTime, result.AbsenceTime });
            }

            return myOrders;

按需使用吧。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值