从XML写入数据表 [英] Writing into datatable from XML

查看:118
本文介绍了从XML写入数据表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是我的XML结构。



 <  < span class =code-leadattribute> school  >  
< 标识 rollno = 01 >
< 信息 名称 = ABC 年龄 = 21 < span class =code-attribute> 性别 = M / >
< / Identification >
< / school >





我想将这种XML格式读入DataTable,以便DataTable拥有数据以下面提到的形式



Rollno姓名年龄性别

01 ABC 21 M



我怎样才能实现这个目标?



谢谢。



我是什么尝试过:



XmlTextReader xmlContent = new XmlTextReader(@XMLPath);

DataSet tableSet = new DataSet() ;

tableSet.ReadXml(xmlContent);

DataTableObject = tableSet.Tables [0];

使用上面的代码,我能够读取XML,但是DataTable的输出并不像我在questio中指定的那样,它也在UI中创建了一个cloumn名称IdentificationID,我不知道需要

解决方案

引用:

它还创建了一个cloumn名称IdentificationID in我不需要的用户界面

但如果仔细查看该栏中的值,则 0



如果你还检查了 tableSet.Tables [ 1 ] 的内容,它也有这个不需要的列 Identification_Id 并且它的值也为0.



如果将XML更改为更加明显,那么额外的列正在做什么

 <   school  > ;  
< 标识 rollno = 01 >
< 信息 名称 = ABC 年龄 = 21 性别 = M / >
< / Identification >
< 标识 rollno = 02 >
< 信息 名称 = BCD 年龄 = 22 性别 = F / >
< / Identification >
< / school >



现在查看数据集中的两个数据表... Identification_Id = 0匹配原始数据,Identification_Id = 1将行与我的新数据项匹配。



所以你可以像这样加入两个数据表

  var  dt1 = tableSet.Tables [ 0 ];  //  包含标识内容 
var dt2 = tableSet.Tables [ 1 ]; // 包含信息内容

var res =( from t1 in dt1.AsEnumerable()
join t2 in dt2.AsEnumerable()on( int )t1 [ Identification_Id]等于( int )t2 [ Identification_Id]
选择 new
{
rollno = t1 [ rollno],
Name = t2 [ 名称],
年龄= t2 [ 年龄],
性别= t2 [ 性别]
})。ToList();

或者如果您更喜欢这种格式...

  var  res = dt1.AsEnumerable()
.Join(dt2.AsEnumerable(),t1 = > int )t1 [ Identification_Id],t2 = < span class =code-keyword>> ( int )t2 [ < span class =code-string> Identification_Id],
(t1,t2)= > new
{
rollno = t1 [ rollno],
Name = t2 [ 名称],
年龄= t2 [ 年龄],
性别= t2 [ 性别]
})。ToList() ;



您在标签中提到了DataGrid,因此您可以使用

 dataGrid1.DataSource = res; 



或者如果你确实想要一个DataTable,你可以做一些像

  var  resultTable = < span class =code-keyword> new  DataTable(); 
resultTable.Columns.Add( rollno);
resultTable.Columns.Add( 名称);
resultTable.Columns.Add( 年龄);
resultTable.Columns.Add( Sex);

foreach var i in res)
resultTable.Rows.Add(i.rollno,i.Name,i.Age,i.Sex);

如果需要,记得处理任何空值to。


你也可以使用 XElement类(System.Xml.Linq) [ ^ ]



  string  s =  @ < ; school> 
< Identification rollno =01>
< Information Name =ABCAge =21Sex =M/>
< / Identification>
< Identification rollno =02>
< Information Name =BCDAge = 22性别=F/>
< / Identification>
< / school>
;

XElement xe = XElement.Parse(s);
// 或者如果你有一个文件
// XElement xe = XElement.Load(fileName);
var result =( from el xe.Elements( 识别
subEl = el.Element( 信息
选择 new
{
RollNo = int .Parse(el.Attribute( rollno)。值),
名称= subEl.Attribute( 名称)。值,
年龄= int .Parse(subEl.Attribute( 年龄) .Value),
性别= char .Parse(subEl.Attribute( 性别)。值),
})。ToList();

dataGridView.DataSource = result;



要将结果转换为DataTable,您必须按照解决方案1中的建议循环遍历列表。


Below is my XML structure.

<school>
  <Identification rollno="01">
    <Information Name="ABC" Age="21" Sex="M" /> 
  </Identification>
</school>



I want to read this XML format into DataTable so that DataTable has data in form of as mentioned below

Rollno Name Age Sex
01 ABC 21 M

How can I achieve this?

Thank You.

What I have tried:

XmlTextReader xmlContent = new XmlTextReader(@"XMLPath");
DataSet tableSet = new DataSet();
tableSet.ReadXml(xmlContent);
DataTableObject = tableSet.Tables[0];
With the above code I was able to read the XML but the output which DataTable had was not as I have specified in the questio and it is also creating a cloumn names IdentificationID in the UI which I don't need

解决方案

Quote:

it is also creating a cloumn names IdentificationID in the UI which I don't need

But if you look carefully at the value in that column it is 0.

If you also examine the contents of tableSet.Tables[1], it also has this "un-needed" column Identification_Id and it also has a value of 0.

It becomes more apparent what that extra column is doing if you change your XML to be

<school>
  <Identification rollno="01">
    <Information Name="ABC" Age="21" Sex="M" /> 
  </Identification>
  <Identification rollno="02">
    <Information Name="BCD" Age="22" Sex="F" /> 
  </Identification>
  </school>


Now look at the two datatables in the dataset ... Identification_Id = 0 matches up your original data and Identification_Id = 1 matches up the rows with my new data item.

So you can JOIN the two data tables together like this

var dt1 = tableSet.Tables[0];   // contains the identification stuff
var dt2 = tableSet.Tables[1];   // contains the Information stuff

var res = (from t1 in dt1.AsEnumerable()
    join t2 in dt2.AsEnumerable() on (int) t1["Identification_Id"] equals (int) t2["Identification_Id"]
    select new
    {
        rollno = t1["rollno"],
        Name = t2["Name"],
        Age = t2["Age"],
        Sex = t2["Sex"]
    }).ToList();

or if you prefer this format...

var res = dt1.AsEnumerable()
            .Join(dt2.AsEnumerable(), t1 => (int) t1["Identification_Id"], t2 => (int) t2["Identification_Id"],
                (t1, t2) => new
                {
                    rollno = t1["rollno"],
                    Name = t2["Name"],
                    Age = t2["Age"],
                    Sex = t2["Sex"]
                }).ToList();


You've mentioned DataGrid in your tags so you could just use

dataGrid1.DataSource = res;


Or if you really do want a DataTable as a result you can do something like

var resultTable = new DataTable();
resultTable.Columns.Add("rollno");
resultTable.Columns.Add("Name");
resultTable.Columns.Add("Age");
resultTable.Columns.Add("Sex");

foreach (var i in res)
    resultTable.Rows.Add(i.rollno, i.Name, i.Age, i.Sex);

remembering to handle any null values if you need to.


You can also do basically the same thing using the XElement Class (System.Xml.Linq)[^]

string s = @"<school>
    <Identification rollno=""01"">
        <Information Name=""ABC"" Age=""21"" Sex=""M"" />
    </Identification>
    <Identification rollno=""02"">
        <Information Name=""BCD"" Age=""22"" Sex=""F"" />
    </Identification>
</school>";

XElement xe = XElement.Parse(s);
// Or if you have a file
// XElement xe = XElement.Load(fileName);
var result = (from el in xe.Elements("Identification")
              let subEl = el.Element("Information")
              select new
              {
                  RollNo = int.Parse(el.Attribute("rollno").Value),
                  Name = subEl.Attribute("Name").Value,
                  Age = int.Parse(subEl.Attribute("Age").Value),
                  Sex = char.Parse(subEl.Attribute("Sex").Value),
              }).ToList();

dataGridView.DataSource = result;


To convert the result to a DataTable, you have to loop through the list as suggested in Solution 1.


这篇关于从XML写入数据表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆