C#-查询XML并填充多维对象

C#-查询XML并填充多维对象,c#,xml,C#,Xml,我需要能够查询xml文档,这样我就可以用与其年份和日期对应的数据填充对象。XML会随时间而变化,如果没有报告该年/月的某个数据点的值,则标记中根本没有该值。我仍然希望填充当月的对象,但为其插入一个0 例如,如果一个xml包含2015年和2016年第1、2、4个月的值,而2016年第3、4、5、6个月的值,那么我需要一个能够处理这种可变性及其多个维度的对象。我需要类似于[[Year:2015,Months:[1,2,4]],[Year:2016,Months:[3,4,5,6]]] 我想我的问题实

我需要能够查询xml文档,这样我就可以用与其年份和日期对应的数据填充对象。XML会随时间而变化,如果没有报告该年/月的某个数据点的值,则标记中根本没有该值。我仍然希望填充当月的对象,但为其插入一个0

例如,如果一个xml包含2015年和2016年第1、2、4个月的值,而2016年第3、4、5、6个月的值,那么我需要一个能够处理这种可变性及其多个维度的对象。我需要类似于
[[Year:2015,Months:[1,2,4]],[Year:2016,Months:[3,4,5,6]]]

我想我的问题实际上分为两部分

1) 存储变化如此之大的数据的最佳方式是什么。收集列表键值对?多维数组?(我经常从python和JavaScript转换过来,所以我可能有错误的术语)

2) 如何查询xml并填充这样的对象

对象

public class obj1 
{
    public string[] years { get; set; }
    public string[] months { get; set; }


}
XML

<PRODUCTION_SET>
   <ENTITY>
       <METADATA>
       .
       .
       </METADATA>
       <HEADER>
       .
       .
       </HEADER>
       <PRODUCTION>
           <YEAR NUMBER = "2015">
               <MONTH NUMBER = "1">
                   <DATA1></DATA1>
                   <DATA2></DATA2>
               </MONTH>
               <MONTH NUMBER = "2">
                   <DATA1></DATA1>
                   <DATA2></DATA2>
               </MONTH>
               .
               . 
               . 
           </YEAR>
           <YEAR NUMBER = "2016">
               <MONTH NUMBER = "1">
                   <DATA1></DATA1>
                   <DATA2></DATA2>
               </MONTH>
               <MONTH NUMBER = "2">
                   <DATA1></DATA1>
                   <DATA2></DATA2>
               </MONTH>
               .
               . 
               . 
           </YEAR>
        </PRODUCTION>
    <ENTITY>
</PRODUCTION_SET>  

.
.
.
.
.
. 
. 
.
. 
. 
查询

    public IEnumerable<obj1> queryProduction()
    {
         return this.doc.Root.Elements("PRODUCING_ENTITY").Select(pe => new obj1{
            foreach(var year in pe.Element("PRODUCTION").Elements("YEAR") .....?){
            // do stuff to assign months to current year in object.
            }

        }

    }
public IEnumerable queryProduction()
{
返回此.doc.Root.Elements(“生产实体”)。选择(pe=>new obj1{
foreach(pe.要素(“生产”).要素(“年度”)的var年…?){
//在对象中为当前年份指定月份。
}
}
}
试试xml linq

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


namespace ConsoleApplication33
{

    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            obj1.obj1s = doc.Descendants("YEAR").Select(x => new obj1
            {
                year = (int)x.Attribute("NUMBER"),
                month = (int)x.Element("MONTH").Attribute("NUMBER")
            }).ToList();

        }

    }
    public class obj1
    {
        public static List<obj1> obj1s = new List<obj1>();
        public int year { get; set; }
        public int month { get; set; }


    }


}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
命名空间控制台应用程序33
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
XDocument doc=XDocument.Load(文件名);
obj1.obj1s=文件子体(“年份”)。选择(x=>新obj1
{
年份=(int)x.属性(“数字”),
month=(int)x.Element(“month”).属性(“NUMBER”)
}).ToList();
}
}
公共类obj1
{
公共静态列表obj1s=新列表();
公共整数年{get;set;}
公共整数月{get;set;}
}
}
试试xml linq

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


namespace ConsoleApplication33
{

    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            obj1.obj1s = doc.Descendants("YEAR").Select(x => new obj1
            {
                year = (int)x.Attribute("NUMBER"),
                month = (int)x.Element("MONTH").Attribute("NUMBER")
            }).ToList();

        }

    }
    public class obj1
    {
        public static List<obj1> obj1s = new List<obj1>();
        public int year { get; set; }
        public int month { get; set; }


    }


}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
命名空间控制台应用程序33
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
XDocument doc=XDocument.Load(文件名);
obj1.obj1s=文件子体(“年份”)。选择(x=>新obj1
{
年份=(int)x.属性(“数字”),
month=(int)x.Element(“month”).属性(“NUMBER”)
}).ToList();
}
}
公共类obj1
{
公共静态列表obj1s=新列表();
公共整数年{get;set;}
公共整数月{get;set;}
}
}

您可以将整个内容存储为列表,其中对象是用户定义的类型(类),它将有两个属性,即年和月。年属性可以是int类型,而月将是列表。因此,本质上它将如下所示:

public class YearStats
{
    public int Year { get; set; }

    public IList<int> Months { get; set; }

    public YearStats()
    {
        Months = new List<int>();
    }
}
公共类统计信息
{
公共整数年{get;set;}
公共IList月数{get;set;}
公共统计数字()
{
月份=新列表();
}
}
如果您还需要存储天数的数据,那么您可以将月份的类型更改为IList

您可以使用以下代码段加载数据

XElement doc = XElement.Load("Test.xml");
        IEnumerable<XElement> yearList =
                                 from el in doc.Elements("YEAR")
                                select el;
        List<YearStat> yearData = new List<YearStat>();

        foreach (XElement yearEle in yearList)
        {
            YearStat year = new YearStat();

            year.Year = int.Parse((string)yearEle.Attribute("NUMBER"));

            var monthList = yearEle.Elements("Month");

            List<int> monthData = new List<int>();

            foreach(XElement monthEle in monthList)
            {
                monthData.Add(int.Parse((string)monthEle.Attribute("NUMBER")));
            }

            year.Months = monthData;

            yearData.Add(year);
        }
XElement doc=XElement.Load(“Test.xml”);
IEnumerable年表=
从文件要素中的el(“年”)
选择el;
列表年份数据=新列表();
foreach(年度列表中的XElement yearEle)
{
YearStat year=新的YearStat();
year.year=int.Parse((字符串)yearEle.Attribute(“NUMBER”);
var monthList=年要素(“月”);
List monthData=新列表();
foreach(月列表中的XElement monthEle)
{
添加(int.Parse((string)monthEle.Attribute(“NUMBER”));
}
年.月=月数据;
年份数据。添加(年份);
}

您可以将整个内容存储为列表,其中对象是用户定义的类型(类),它将有两个属性,即年和月。年属性可以是int类型,而月将是列表。因此,本质上它将如下所示:

public class YearStats
{
    public int Year { get; set; }

    public IList<int> Months { get; set; }

    public YearStats()
    {
        Months = new List<int>();
    }
}
公共类统计信息
{
公共整数年{get;set;}
公共IList月数{get;set;}
公共统计数字()
{
月份=新列表();
}
}
如果您还需要存储天数的数据,那么您可以将月份的类型更改为IList

您可以使用以下代码段加载数据

XElement doc = XElement.Load("Test.xml");
        IEnumerable<XElement> yearList =
                                 from el in doc.Elements("YEAR")
                                select el;
        List<YearStat> yearData = new List<YearStat>();

        foreach (XElement yearEle in yearList)
        {
            YearStat year = new YearStat();

            year.Year = int.Parse((string)yearEle.Attribute("NUMBER"));

            var monthList = yearEle.Elements("Month");

            List<int> monthData = new List<int>();

            foreach(XElement monthEle in monthList)
            {
                monthData.Add(int.Parse((string)monthEle.Attribute("NUMBER")));
            }

            year.Months = monthData;

            yearData.Add(year);
        }
XElement doc=XElement.Load(“Test.xml”);
IEnumerable年表=
从文件要素中的el(“年”)
选择el;
列表年份数据=新列表();
foreach(年度列表中的XElement yearEle)
{
YearStat year=新的YearStat();
year.year=int.Parse((字符串)yearEle.A