使用xml文件中的值为对象数组的每个成员分配

时间:2012-11-28 23:18:35

标签: c# xml arrays object

我有一个程序,其中变量周由对象数组[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

如果有人可以指导我或指导我找到有助于解决这个问题的资源,那将非常感谢,谢谢:)

1 个答案:

答案 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节点,所以我们通过选择匿名对象进行投影,这将代表一天。此对象有两个属性 - NameHours。我们从<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>