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>

namestart、およびfinishordurationのいずれか存在する値のみが必要です。

これは私がこれまでに持っているものです:

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)
{
    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 に答える
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 に答える
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"),
    });

対応する属性が存在しない場合、またはフィールドは null になります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

オブジェクト Tasks があると仮定すると、次のようなものはどうでしょうか。

 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 に答える