我有一个程序,其中变量周由对象数组[7]天组成,而日期由对象数组[9]小时组成。每小时对象有3个数据成员。我想为特定日期和小时的每个成员分配一个xml文件中的特定值:
<parent>
<day>wednesday
<hour>18.00
<value1>5</value1>
<value2>10</value2>
<value3>15</value3>
</hour>
</day>
<day>thursday
<hour>18.00
<value1>2</value1>
<value2>3</value2>
<value3>9</value3>
</hour>
</day>
</parent>
day[wedensday].hour[18.00].member1 = xml.day[wednesday].hour[18.00].value1
day[wedensday].hour[18.00].member1 = xml.day[wednesday].hour[18.00].value2
day[wedensday].hour[18.00].member1 = xml.day[wednesday].hour[18.00].value3
我是使用xml的新手,并提出了以下伪代码,但我很难实现它:
member[i] = value[i] where day[i].name == xml.day && day[i].hour[i] == xml.hour
如果有人可以指导我或指导我找到有助于解决这个问题的资源,那将非常感谢,谢谢:)
答案 0 :(得分:1)
您可以使用Linq将xml解析为xml:
XDocument xdoc = XDocument.Load(path_to_xml_file);
var week = new
{
Days = xdoc.Descendants("day")
.Select(day => new {
Name = ((XText)day.FirstNode).Value.Trim(),
Hours = day.Descendants("hour")
.Select(hour => new {
Time = ((XText)hour.FirstNode).Value.Trim(),
Values = hour.Elements()
.Select(node => (int)node)
.ToList()
}).ToList()
}).ToList()
};
周将是强类型的匿名对象。用法:
var daysCount = week.Days.Count; // 2
var secondDayName = week.Days[1].Name; // thursday
var hoursInSecondDay = week.Days[1].Hours.Count; // 1
var timeOfFirstHour = week.Days[1].Hours[0].Time; // 18:00
var value3 = week.Days[1].Hours[0].Values[2]; // 9
说明:
xdoc.Descendants("day")
返回所有<day>
个节点。但是我们不需要xml节点,所以我们通过选择匿名对象进行投影,这将代表一天。此对象有两个属性 - Name
和Hours
。我们从<day>
元素的第一个节点获得的名称,即文本节点(第一天的'wednesday')。我们通过选择<hour>
的{{1}}元素并对表示小时的匿名对象进行投影来获得的时间。等
如果您将日期名称和小时值移动到以下属性:
<day>
然后解析将如下所示:
<parent>
<day name="wednesday">
<hour time="18.00">
<value1>5</value1>
<value2>10</value2>
<value3>15</value3>
</hour>
</day>
</parent>