用Linq在C#中提取XML数据难度

问题描述:

所以我正在阅读一个xml文件来创建一个字典,但我无法弄清楚如何访问我想要的xml字段。用Linq在C#中提取XML数据难度

以下是我想要阅读的XML格式。

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

下面是我到目前为止的代码。我已经尝试了很多变种来寻找任务和顺序,比如任务:(string)e,或者e.ToString()或者e.Elements(“Task”)。Value.ToString();而对于订单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); 
     } 

到目前为止,这些都没有给我正确的结果,而我真的不能确定什么样的合适的方式来获得这些数据,所以任何帮助,将不胜感激!

添加第二个循环迭代的任务和提取值

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); 
      } 
     } 
    } 

或者你可以用LINQ查询这样

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

做,或创建一个从匿名对象

字典
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()));