使用C#读取XML并填充List <t>

时间:2018-04-26 22:23:15

标签: c# xml

我有一个XML文档,其中包含有关两个表的数据 结构就像这样

<doc>
  <table name="ordini">
    <row>
      <field name="id">0431524493258932</field>
      <field name="anno">2018</field>
      <field name="att">0000</field>
      <field name="cen">01</field>
      ...
    </row>  
    <row>
      <field name="id">1041524493596749</field>
      <field name="anno">2018</field>
      <field name="att">0000</field>
      <field name="cen">01</field>
      ...
    </row>
...

</table>
 <table name="righe">
    <row>
      <field name="id">0431524493258932</field>
      <field name="anno">2018</field>
      <field name="att">0000</field>
      <field name="cen">4U</field>
....

</table>
<doc>

我正在尝试这种方式使用XML中的第一个表,并且存在很多混淆

var doc = XDocument.Load(filename);

var ordcli = doc.Descendants("table")
             .Where(i => (string)i.Attribute("name") == "ordini")
             .Descendants("row")
             .Select(e => e.Elements());

foreach (var item in ordcli)
{
    foreach (var i in item)
    {
        Console.WriteLine(i);
    }
}

如何读取每个行元素并获取字段名称以实例化我的Order类和OrderDetails类?

当我填充List<Order>List<OrderDetails>时,我可以填充相关表格 我希望我已经很好地解释了我的要求 我从未使用过XlmReader或Linq2Xml。这是第一次。

1 个答案:

答案 0 :(得分:0)

尝试以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            new XML_DataSet(FILENAME);
        }
    }
    public class XML_DataSet
    {
        static DataSet ds = new DataSet();

        public XML_DataSet(string filename)
        {
            XDocument doc = XDocument.Load(filename);

            foreach(XElement table in doc.Descendants("table"))
            {
                ds.Tables.Add(ReadTable(table));
            }

        }

        private DataTable ReadTable(XElement table)
        {
            DataTable dt = new DataTable();
            Boolean first = true;

            foreach (XElement xRow in table.Elements("row"))
            {
                if (first)
                {
                    foreach (XElement field in xRow.Elements("field"))
                    {
                        dt.Columns.Add((string)field.Attribute("name"), typeof(string));
                    }
                    first = false;
                }
                DataRow newRow = dt.Rows.Add();
                foreach (XElement field in xRow.Elements("field"))
                {
                    newRow[(string)field.Attribute("name")] = (string)field;
                }
            }

            return dt;
        }
    }

}