2017-08-09 6 views
0

xmlファイルを読み込んで辞書を作成する作業をしていますが、xmlフィールドにアクセスする方法がわかりません。LinqでC#の難易度でXMLデータを抽出する

以下は、読みたいXMLのフォーマットです。以下は

<Days> 
    <Day Name="Monday"> 
     <Task Order="1">TestTask</Task> 
     <Task Order="2">Test2</Task> 
    </Day> 
</Days> 

これまでの私のコードです。私はtask:(文字列)e、e.ToString()、e.Elements( "Task")などのタスクや順序を見つけるためにさまざまなバリエーションを試しました。そして注文e.Attributes( "Order")。ToString();

 string today = DateTime.Now.ToString("dddd");   
     var allItems = new Dictionary<string, int>(); 

     XElement root = XElement.Parse(_orderxml); 
     IEnumerable<XElement> address = 
      from el in root.Elements("Day") 
      where el.Attribute("Name").Value == today 
      select el; 
     foreach (XElement e in address) 
     { 
      string task = ???; 
      string order = ???; 
      allItems.Add(task, (int)order); 
     } 

これまでのところ、これらのどれもが私に右の結果を与えていない、と私は、このデータを取得するための適切な方法があるので、任意の助けをいただければ幸い何の本当にわからないんですよ!

答えて

2

タスクを反復処理し、値

static void Main() 
    { 
     string _orderxml = @"<Days> <Day Name=""Wednesday"">  <Task Order=""1"">TestTask</Task>  <Task Order=""2"">Test2</Task> </Day></Days>"; 
     string today = DateTime.Now.ToString("dddd"); 
     var allItems = new Dictionary<string, int>(); 

     XElement root = XElement.Parse(_orderxml); 
     IEnumerable<XElement> address = 
      from el in root.Elements("Day") 
      where el.Attribute("Name").Value == today 
      select el; 
     foreach (XElement e in address) 
     { 
      foreach (XElement t in e.Descendants()) 
      { 
       string task = t.Value.ToString(); 

       int order = int.Parse(t.Attribute("Order").Value.ToString()); 
       allItems.Add(task, (int)order); 
      } 
     } 
    } 

それとも、この

var result=root.Descendants("Day").Where(d=>d.Attribute("Name").Value==today).Descendants("Task").Select(x => new {Task=x.Value,Order=x.Attribute("Order") }); 

または匿名オブジェクトから辞書を作成するなどのLINQクエリでそれを行うことができますを抽出するために、第二のループを追加

var result = root.Descendants("Day").Where(d=>d.Attribute("Name").Value==today).Select(x => new { Task = x.Value.ToString(), Order = x.Attribute("Order") }).ToDictionary(c => c.Task, c => c.Order); 

また、linqクエリから直接辞書を作成する

var result = root.Descendants("Day").Where(d=>d.Attribute("Name").Value==today).ToDictionary(c => c.Value.ToString(), c => int.Parse(c.Attribute("Order").Value.ToString()));