2012-05-15 53 views
0

我有一個鏡頭問題... 我有一個xml文件我想存儲在元素列表中。使用xlinq Faltten列表(帶有回報)

我想展平這個列表,以便遵循另一個數據源給出的另一個模式。

這裏是一個XML樣本

<?xml version="1.0" encoding="utf-8" ?>  
    <Actors> 
    <Actor FirstName="Will" LastName="Smith"> 
     <Movie name="Men in Black" Date="1999"/> 
     <Movie name="Wild wild west" Date="1999"/> 
     <Movie name="Ali" Date="2002"/> 
    </Actor> 
    <Actor FirstName="Jason" LastName="Statham"> 
    <Movie name="The Transporter" Date="2002"/> 
    <Movie name="Revolver" Date="2005"/> 
    <Movie name="The Bank Job" Date="2008"/> 
    <Movie name="Transporter 3" Date="2008"/> 
    </Actor> 
</Actors> 

然後,我

public class Actors 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Name { get; set; } 
    public string Date { get; set; } 
} 

現在創建我的對象,我看這個XML與XLINQ這樣的:

 private static void Read(string fileName) 
    { 
     XDocument testDoc = XDocument.Load(fileName); 
     var reader = from c in testDoc.Root.Elements() 
        select c; 


     var list = reader.ToList(); 



    } 

現在我想填寫每個項目的列表和所有數據(名字,姓氏,名稱,日期)必須存在。

我認爲屈服回報必須解決我的問題,但實際上我不明白它是如何工作的。 (我想實現它)

感謝

回答

1

我覺得你只是想

List<Actors> actors = (from movie in XDocument.Load(fileName).Descendants("Movie") 
    select new Actors() { 
    FirstName = (string)movie.Parent.Attribute("FirstName"), 
    LastName = (string)movie.Parent.Attribute("LastName") 
    Name = (string)movie.Attribute("name"), 
    Date = (string)movie.Attribute("Date") 
}).ToList(); 
+0

它看起來相當不錯,但我不知道什麼原因,我無法過濾任何節點。 xxx.Descendants(「Movie」)總是返回0 ...但如果If put xxx.Descendants();我會收到我的完整列表。我使用de XDocument.Load(..),奇怪的是,當我在屬性中添加一個值時,將它考慮在內... – Refre

+0

好的,名稱空間問題..我解決了它 – Refre

+0

XML是否在表單中有名稱空間聲明例如' ...'?在那種情況下,例如XDocument doc = XDocument.Load(「file.xml」); XNamespace df = doc.Root.Name.Namespace;列表 actors =(從電影中的XDocument.Load(fileName).Descendants(df +「Movie」)選擇新的...).ToList();'應該工作。 –

0

使用此查詢

var reader = from a in testDoc.Root.Descendants("Actor") 
      from m in a.Descendants("Movie") 
      select new Actors 
      { 
       FirstName = a.Attribute("FirstName").Value, 
       LastName = a.Attribute("LastName").Value, 
       Name = m.Attribute("name").Value, 
       Date = m.Attribute("Date").Value 
      };