2011-12-15 7 views
0

私は私の目標は、以下のXMLスイングとミスLINQ

<AllVendors xmlns="http://important/data"> 
    <Vendor> 
     <VendorId>1</VendorId> 
     <VendorName>Vendor A</VendorName> 
    </Vendor> 
    <Vendor> 
     <VendorId>2</VendorId> 
     <VendorName>Vendor B</VendorName> 
    </Vendor> 
    <Vendor> 
     <VendorId>3</VendorId> 
     <VendorName>Vendor C</VendorName> 
    </Vendor> 
</AllVendors> 

と、次のCLR型

class Vendor 
{ 
    public Vendor(string vendorId, string vendorName) 
    { 
     VendorId = vendorId; 
     VendorName = vendorName; 
    } 

    public string VendorId { get; set; } 
    public string VendorName { get; set; } 
} 

と、次の基本的な相互作用

class VendorInteraction 
{ 
    private List<Vendor> Vendors { get; set; } 

    private void GetVendors(string xml) 
    { 
     var rawData = XElement.Parse(xml); 
     XNamespace ns = Constants.TheNamespace; 

     **var vendors = rawData.Descendants(ns + "AllVendors").Elements().Elements().Select(vendor => new Vendor(vendor.Value, vendor.Value)).ToList();** 

     if (Vendors == null) 
      Vendors = new List<Vendor>(); 
     else 
      Vendors.Clear(); 

     Vendors.AddRange(vendors); 
    } 
} 

を持っていますLINQ to XMLクエリに基づいて投影されるリストを返す。私が持っているクエリは、これまでのところ、このような出力を生成します。私は、リスト内の各ベンダーのインスタンスをしたいと思います

1 1 
Vendor A Vendor A 
2 2 
Vendor B Vendor B 
3 3 
Vendor C Vendor C 

はこのように見えるように:

1 Vendor A 
2 Vendor B 
3 Vendor C 

私はLINQとあなたの助けを借りて、非常に良好ではないですすごく感謝しています!

更新:実際のソリューション

var vendors = rawData.Descendants(ns + "AllVendors").Elements() 
        .Select(x => new Vendor(x.Element(ns + "VendorId").Value, 
              x.Element(ns + "VendorName").Value)) 
        .ToList(); 

@AVDと@BrokenGlassは私は非常に近くなったが、私が要素のコレクションを取得するために必要と思われます。

+0

なぜあなたは 'リストにデシリアライズを検討していない、これを試してみてください '? –

+0

@Munim XmlSerializerはLINQ to XMLよりも効率的であると思いますか?あるアプローチの長所と短所は別のものに比べて何ですか? – syneptody

答えて

1

var vendors = rawData.Descendants(ns+"Vendor") 
        .Select(x => new Vendor(x.Element(ns+"VendorId").Value, 
              x.Element(ns+"VendorName").Value)) 
        .ToList(); 
+0

ありがとうございました。これは私を非常に近くにした。私は実際に私に探していた完全な結果を与えたコードで質問を更新しました。 – syneptody

1

必要な値Vendorのコンストラクタのパラメータは、ベンダー要素内のサブ要素自体あるよう:

var vendors = rawData.Descendants(ns + "Vendor") 
        .Select(x => new Vendor(x.Element("VendorId").Value, 
              x.Element("VendorName").Value)) 
        .ToList();