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