2017-04-15 10 views
2

私はlinqからxmlで始まり​​ます。私はxmlファイルを持っています。私はそれを読んでいます。オブジェクト(自転車)をIdで選択してください。 私のテストxmlファイルは次のとおりです。id linq to 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

を使用することができます

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

プロパティを使用していない場合は、クラスを変更してプロパティを使用できます。したがって、匿名型を作成する必要はありません。

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構文でそれを構築する場合:あなたがあなたの問題のように、1台のバイクを取得したい場合はあなただけのFirstOrDefaultを使用し、その後new Bike { ... }

関連する問題