0

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

如果有人可以指导我或指导我找到有助于解决此问题的资源,将不胜感激,谢谢:)

4

1 回答 1

1

您可以使用 Linq to 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()
};

week 将是强类型匿名对象。用法:

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>元素的第一个节点获得的名称,即文本节点(第一天的“星期三”)。我们通过选择<hour>元素<day>并投影到代表小时的匿名对象来获得小时。等等。


如果您将日期名称和小时值移动到如下属性:

<parent>
  <day name="wednesday">  
    <hour time="18.00">    
      <value1>5</value1>
      <value2>10</value2>
      <value3>15</value3>
    </hour>
  </day>
</parent>

然后解析将如下所示:

XDocument xdoc = XDocument.Load(path_to_xml_file);
var week = new
{
    Days = xdoc.Descendants("day")
                .Select(day => new {
                    Name = (string)day.Attribute("name"),
                    Hours = day.Descendants("hour")
                                .Select(hour => new {
                                    Time = (string)hour.Attribute("time"),
                                    Values = hour.Elements()
                                                .Select(node => (int)node)
                                                .ToList()
                                }).ToList()
                }).ToList()
};
于 2012-11-29T00:29:53.243 回答