2017-04-15 26 views
2

我是在linq到xml的begginer。我有一個xml文件,我想讀它,並且選擇對象(自行車)通過Id。 我的測試XML文件是:通過id linq選擇一個對象到xml C#

<Bikes> 
<!--- - - - - - - - - - - - - - - - - - - -A new Bike- - - - - - - - - - - - - - - - - - - --> 
    <Bike Id="1"> 
     <Big_Picture>Image</Big_Picture> 
     <Small_Picture>Image</Small_Picture> 
     <Emblem_Picture>Image</Emblem_Picture> 
     <Firm>Image</Firm> 
     <Model>Image</Model> 
     <Price>Image</Price> 
     <Colour>Image</Colour> 
     <Frame_Size>Image</Frame_Size> 
     <Description>Image</Description> 
     <Gears>Image</Gears> 
     <Groupset>Image</Groupset> 
     <Brakes>Image</Brakes> 
     <Frame_Material>Image</Frame_Material> 
     <Wheel>Image</Wheel> 
    </Bike> 
</Bikes> 

我想ID選擇此自行車(1),然後把這種自行車的元素在我的類(自行車)的對象。我怎樣才能做到這一點?我的代碼,當然,不執行任務:

XDocument xdoc = XDocument.Load("Bikes.xml"); 
xdoc.Descendants("Bike").Select(p => new { 
     id = p.Attribute("Id").Value, 
     picture = p.Element("Small_Picture").Value, 
     model = p.Element("Model").Value, 
     price = p.Element("Price").Value 
    }).ToList().ForEach(p => { 
     Bike bike = new Bike(p.id, p.picture, p.model, p.price);//Constructor 
     bikes_xml.Add(bike); 
    }); 
+1

「不起作用」是什麼意思? –

+0

對不起,錯誤地表示 – Eldar

+0

這是什麼問題?什麼不起作用? – CodingYoshi

回答

0

如果你想獲取一個自行車,你的問題,然後使用FirstOrDefault

var data = XDocument.Load("data.xml") 
        .Descendants("Bike") 
        .FirstOrDefault(item => item.Attribute("Id").Value == "1"); 
if(data != null) 
{ 
    Bike bike = new Bike(data.Attribute("Id").Value, 
         data.Element("Small_Picture").Value, 
         data.Element("Model").Value, 
         data.Element("Price").Value); 
} 

如果你想建造其在LINQ語法則:

Bike x = (from bike in XDocument.Load("data").Descendants("Bike") 
      select new Bike(bike.Attribute("Id").Value, 
          bike.Element("Small_Picture").Value, 
          bike.Element("Model").Value, 
          bike.Element("Price").Value)) 
     .FirstOrDefault(item => item.Id == 1);  

和@SelmanGenç建議,看看你是否可以更改使用Object Initializer而不是帶有參數的構造函數。更多關於它的檢查What's the difference between an object initializer and a constructor?

+0

謝謝,第一個變體是我需要的。 – Eldar

+0

@Eldar - 歡迎您:)考慮對象初始值設定項與構造函數提示:) –

1

如果不起作用你的意思是你所得到的所有項目,所有你需要的是一個Where

var bikes = xdoc.Descendants("Bike") 
       .Where(e => (int)e.Attribute("Id") == 1) 
       .Select(p => new 
       { 
        id = p.Attribute("Id").Value, 
        picture = p.Element("Small_Picture").Value, 
        model = p.Element("Model").Value, 
        price = p.Element("Price").Value 
       }).ToList(); 

如果您尚未使用屬性,則可以將其更改爲使用屬性,因此您無需創建匿名類型。你可以只用new Bike { ... }