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

本文关键字:lt 存储 gt 列表 XML 转换 | 更新日期: 2023-09-27 18:29:45

我有一种情况,在中我必须从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。

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

您可以将我的代码转换为函数

   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;
        }
    }​

使用类似的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; }
    }
}
​