将存储库中的嵌入 XML 转换为列表<T>

Convert embedded XML to List<T> within a Repository

我有一种情况,我必须从 XML 文件中读取我的主数据。 因此,我创建了一个如下所示的存储库。

public class XmlReadRepository<T> : IReadRepository<T> where T : class, new()
{
    private IEnumerable<T> _data { get; set; }
    private IQueryable<T> _query { get; set; }

    public XmlReadRepository()
    {
        Type t = typeof(T);
        //Load _data from xml
    }

    public IQueryable<T> All()
    {
        return _query;
    }

    public IQueryable<T> Get(System.Linq.Expressions.Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = "")
    {
        throw new NotImplementedException();
    }        
}

我已经使用以下 SQL 查询

将所有 SQL 数据库数据导出到 XML 文件中
  SELECT *
FROM Company
FOR XML RAW, ROOT('Company')

输出结果如下

<Company>
  <row Id="1" Name="ABC" StartDate="2000-03-01" />
  <row Id="2" Name="XYZ" StartDate="2001-13-11" />
</Company>

xml 以物理方式保存到文件中,并作为资源嵌入。

现在我正在寻找一些将 xml 数据序列化到列表中的快速方法。 我尝试使用流加载 xml 文件,然后通过遍历 XML 使用反射创建的对象。有没有更好的方法可以将 xml 数据序列化到我的 C# 对象。

另外,请分享您对将 xml 作为嵌入式资源是否有益的意见,因为每个 xml 的大小可能在 8MB 左右,并且有 5 个这样的 XML s.

像下面这样使用 xml linq

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml =
                "<Company>" +
                  "<row Id=\"1\" Name=\"ABC\" StartDate=\"2000-03-01\" />" +
                  "<row Id=\"2\" Name=\"XYZ\" StartDate=\"2001-13-11\" />" +
                "</Company>";

            XDocument doc = XDocument.Parse(xml);   // use Load to read from file

            var rows = doc.Descendants("row").Select(x => new
            {
                id = (int)x.Attribute("Id"),
                name = (string)x.Attribute("Name"),
                startDate = (DateTime)x.Attribute("StartDate")
            }).ToList();

            //using xmltextreader
            List<Row> rows2 = new List<Row>();
            StringReader sReader = new StringReader(xml);
            XmlTextReader reader = new XmlTextReader(sReader); //can be filename instead of stringreader
            while(!reader.EOF)
            {
                if (reader.Name != "row")
                {
                    reader.ReadToFollowing("row");
                }
                if (!reader.EOF)
                {
                    XElement newRow = (XElement)XElement.ReadFrom(reader);
                    rows2.Add(new Row() { Id = (int)newRow.Attribute("Id"), name = (string)newRow.Attribute("Name"), startDate = (DateTime)newRow.Attribute("StartDate") });
                }
            }

        }
    }
    public class Row
    {
        public int Id { get; set; }
        public string name { get; set; }
        public DateTime startDate { get; set; }

    }

}
​

你可以把我的代码变成一个函数

   public class Row
    {
        private static XmlTextReader reader = null;
        public int Id { get; set; }
        public string name { get; set; }
        public DateTime startDate { get; set; }

        public Row() { }

        public Row(TextReader sReader)
        {
            reader = new XmlTextReader(sReader); //can be filename instead of stringreader
        }
        public Row Get(string elementName)
        {
            Row results = null;
            if (!reader.EOF)
            {
                if (reader.Name != elementName)
                {
                    reader.ReadToFollowing(elementName);
                }
                if (!reader.EOF)
                {
                    XElement newRow = (XElement)XElement.ReadFrom(reader);
                    results = new Row() { Id = (int)newRow.Attribute("Id"), name = (string)newRow.Attribute("Name"), startDate = (DateTime)newRow.Attribute("StartDate") };
                }
            }
            return results;
        }

    }​