从XML创建通用表的LINQ算法

本文关键字:LINQ 算法 XML 创建 | 更新日期: 2023-09-27 18:03:42

下面是一段代码:

XNamespace z = "#SomeSchema";
var listCols = new HashSet<Col>();
var colNameList = new List<string>(..some values..);
var xElementList = doc.Descendants(z + "row");
return new HashSet<Row>(xElementList .Select(x=> new Row
       {
         Col= new List<Col>(listCols).Select(col =>
         {
           col.Value= (string)x.Attribute(colNameList.First(colName=> colName == col.Name));
           return col;
         }).ToList()
       }));

问题在于,返回值包含一个List of Row,但是所有这些行都具有完全相同的值(对于colvalue)。

,行[1].Col[1]。Value == Row[2].Col[2].Value

这些值应该是完全不同的。我正在从Xml文件中获取这些值。当我调试xElementList时,值是不同的,但是当我尝试用它们创建行时,所有的行都是相同的。实际上,行具有相同的列列表,这是xElementList的最后一条记录。

我做错了什么吗?

谢谢。

从XML创建通用表的LINQ算法

见下面的代码。我把xml读了两遍。一次获取列名并向表中添加列。然后读取xml第二次获得行数据。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
using System.Data;
namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:'temp'test.xml";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            StreamReader sReader = new StreamReader(FILENAME, Encoding.GetEncoding(1252));
            XmlReader reader = XmlReader.Create(sReader);
            Dictionary<string, string> colDict = new Dictionary<string, string>();
            while (!reader.EOF)
            {
                if (reader.Name != "FIELD")
                {
                    reader.ReadToFollowing("FIELD");
                }
                if (!reader.EOF)
                {
                    XElement field = (XElement)XElement.ReadFrom(reader);
                    string attrname = (string)field.Attribute("attrname");
                    string fieldtype = (string)field.Attribute("fieldtype");
                    switch (fieldtype)
                    {
                        case "string":
                            dt.Columns.Add(attrname, typeof(string));
                            break;
                        case "i4":
                            dt.Columns.Add(attrname, typeof(int));
                            break;
                    }
                    colDict.Add(attrname, fieldtype);
                }
            }
            reader.Close();
            sReader = new StreamReader(FILENAME, Encoding.GetEncoding(1252));
            reader = XmlReader.Create(sReader);
            while (!reader.EOF)
            {
                if (reader.Name != "ROW")
                {
                    reader.ReadToFollowing("ROW");
                }
                if (!reader.EOF)
                {
                    XElement row = (XElement)XElement.ReadFrom(reader);
                    DataRow newRow = dt.Rows.Add();
                    foreach (XAttribute attrib in row.Attributes())
                    {
                        string colName = attrib.Name.LocalName;
                        if (colDict.ContainsKey(colName))
                        {
                            switch (colDict[colName])
                            {
                                case "string":
                                    newRow[colName] = (string)attrib;
                                    break;
                                case "i4":
                                    newRow[colName] = (int)attrib;
                                    break;
                            }
                        }
                    }
                }
            }
        }
    }
}