例如我在循环我的table像以下代码(以下代码思路是错误的)只看标题
XElement XEle = new XElement("UserInfos");
for (int i = 0; i < dsDataXml.Tables[0].Columns.Count; i++)
{
for (int j = 0; j < dsDataXml.Tables[0].Rows.Count; j++)
{
XEle.Add(
new XElement("UserInfo",
new XElement(dsDataXml.Tables[0].Columns[i].ToString(),
dsDataXml.Tables[0].Rows[0][j]))
);
}
}
我已经把每列的列名拿到了dsDataXml.Tables[0].Columns[i].ToString();但是我也想同时拿到每列下每个字段的值(也可以是行的每一个字段的值)
目的是为了自动生成XML,因为我一直不想去拼接了,太烦了!
for (int j = 0; j < dsDataXml.Tables[0].Rows.Count; j++)
{
for (int i = 0; i < dsDataXml.Tables[0].Columns.Count; i++)
{
XEle.Add(
new XElement("UserInfo",
new XElement(dsDataXml.Tables[0].Columns[i].ToString(),
dsDataXml.Tables[0].Rows[i][j]))
);
}
}
试一下这个呢?
你是想这样吗:
using System;
using System.Collections.Generic;
using System.Data;
namespace DTTest
{
class Program
{
static void Main(string[] args)
{
var dt = CreateTestData();
var data = GetDataFromDt(dt);
}
static DataTable CreateTestData()
{
DataTable dt = new DataTable();
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Columns.Add("C");
for (int i = 0; i < 10; i++)
{
var row = dt.NewRow();
row[0] = $"A{i}";
row[1] = $"B{i}";
row[2] = $"C{i}";
dt.Rows.Add(row);
}
return dt;
}
static Dictionary<string, List<Object>> GetDataFromDt(DataTable dt)
{
var dic = new Dictionary<string, List<Object>>();
for (int i = 0; i < dt.Columns.Count; i++)
{
var colName = dt.Columns[i].ColumnName;
var values = new List<object>();
foreach (DataRow row in dt.Rows)
{
values.Add(row[i]);
}
dic.Add(colName, values);
}
return dic;
}
}
}
DataSet ds = new DataSet();
ds.Tables.Add(dt1); // Table 1
string dsXml= ds.GetXml();
这时候反射应该登场了,或者自己找个现成ORM框架(比如Dapper)