0

我正在尝试读取一个看起来像这样的文件:

<tasks>
  <task name="Project Management" mode="Automatic" start="07/01/2012 00:00" duration="21" id="954471332"></task>
  <task name="Conception/Approval" mode="Automatic" start="07/01/2012 00:00" duration="6" percentComplete="1" id="1905425539"></task>
  <task name="Define Initial Scope" start="07/04/2012 00:00" finish="07/18/2012 00:00" percentComplete="0.31" id="1154759651"></task>
</tasks>

我只想要, 和or的值name,以存在者为准。startfinishduration

这是我到目前为止所拥有的:

XElement allData = XElement.Load(dlg.FileName);
if (allData != null)
{
    IEnumerable<XElement> tasks = allData.Descendants("task");
    foreach (XElement task in tasks)
    {

    }
}

我确定我必须使用 Attribute 方法,但我不确定如何使用它或语法。

4

4 回答 4

1

我建议在循环之前只获取您需要的元素和值:

XElement allData = XElement.Load(dlg.FileName);
if (allData != null)
{
  var tasks = allData.Descendants("task")
                     .Where(e => e.Attribute("name") != null
                                 && (e.Attribute("start") != null
                                     || e.Attribute("finish") != null))
                     .Select(e => new 
                     {
                       Name = e.Attribute("name").Value,
                       Start = e.Attribute("start").Value,
                       Finish = e.Attribute("finish").Value,
                     });
  foreach(var task in tasks)
  {
    // task.Name will have a value
    // task.Start and/or task.Finish will have a value.
  }
}
于 2012-07-10T18:58:17.743 回答
1

您可以这样做来获取属性:

XElement allData = XElement.Load(dlg.FileName);
if (allData != null)
{
    IEnumerable<XElement> tasks = allData.Descendants("task");
    foreach (XElement task in tasks)
    {
        task.Attribute("name").Value;
        task.Attribute("start").Value;
        task.Attribute("finish").Value;
    }
}
于 2012-07-10T18:53:06.860 回答
0

你可以这样做:

var doc = XDocument.Load(dlg.FileName);
var query = doc.Descendants("task")
    .Select(task => new
    {
        Name = (string)task.Attribute("name"),
        Start = (DateTime)task.Attribute("start"),
        Finish = (DateTime?)task.Attribute("finish"),
        Duration = (long?)task.Attribute("duration"),
    });

如果相应的属性不存在,or 字段将为空FinishDuration

然后只需遍历查询中的项目即可按照您的意愿进行操作。

foreach (var item in query)
{
    var app = c1Schedule1.DataStorage.AppointmentStorage.Appointments.Add();
    app.Subject = item.Name;
    app.Start = item.Start;
    if (item.Finish != null)
    {
        app.Finish = item.Finish.Value;
    }
    if (item.Duration != null)
    {
        app.Duration = item.Duration.Value;
    }
}
于 2012-07-10T19:07:59.440 回答
0

假设您有一个对象任务,那么类似:

 XDocument doc = XDocument.Load(dlg.FileName);
  List<Task> infos = from c in doc.Descendants("task")
              select new Task (c.Element("name").Value, c.Element("start).Value, 
              c.Element("finish").Value);
于 2012-07-10T18:56:09.170 回答