2012-12-14 29 views
0

此問題是從this開始的後續操作。使用Linq從xml解析內部節點

當我嘗試使用linq讀取內部節點時,它不會按預期給我回收集合,而是隻給我一個項目。請參閱測試。

[Test] 
     public void Should_get_all_items() 
     { 
      var item = "<Item status=\"SUCCESS\""+ 
      " message=\"\">" + 
      "<ItemDate>12/21/2012" + 
      "<ItemType>MyType1" + 
      "<ItemUrl title=\"ItemTitle\">http://www.itemurl1.com</ItemUrl>" + 
      "</ItemType>" + 
      "</ItemDate>" + 
      "<ItemDate>12/22/2012" + 
      "<ItemType>MyType2" + 
      "<ItemUrl title=\"Item2Title\">http://www.itemurl2.com</ItemUrl>" + 
      "</ItemType>" + 
      "</ItemDate>" + 
      "</Item>"; 

      XDocument xdoc = XDocument.Parse(item); 
      var query = from i in xdoc.Descendants("Item") 
         let date = i.Element("ItemDate") 
         let type = date.Element("ItemType") 
         let url = type.Element("ItemUrl") 
         select new ItemDate() 
         { 
          Date = ((XText)date.FirstNode).Value, 
          Type = ((XText)type.FirstNode).Value, 
          Url = (string)url, 
          Title = (string)url.Attribute("title"), 
         }; 

      var qItems = query.ToList(); 
      Assert.That(qItems.Count, Is.EqualTo(2)); 
     } 

public class ItemDate 
    { 
     public string Date { get; set; } 
     public string Type { get; set; } 
     public string Url { get; set; } 
     public string Title { get; set; } 
    } 

上述測試失敗。任何想法在這裏出了什麼問題?我覺得這個名字項目已經有些誤導這裏我ItemDates

由於收集後我, -Mike

回答

1
var items = xdoc.Descendants("ItemDate") 
    .Select(e => new ItemDate 
    { 
     Date = e.FirstNode.ToString(), 
     Type = e.Element("ItemType").FirstNode.ToString(), 
     Url = e.Element("ItemType").Element("ItemUrl").Value, 
     Title = e.Element("ItemType").Element("ItemUrl").Attribute("title").Value 
    }) 
    .ToList(); 
+0

非常好的趕上L.B –

0

測試失敗,因爲你的XML只有一個Item節點,因此你只能有一個結果。