2011-12-15 33 views
0

我有下面的XMLSwing和一個錯過的LINQ to XML查詢

<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查詢投影的List。我有查詢到目前爲止產生的輸出是這樣的:

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

你爲什麼不考慮反序列化到你的`名單`? – 2011-12-15 14:46:21

+0

@Munim您認爲XmlSerializer比LINQ to XML更高效嗎?一種方法相對於另一種方法的優缺點是什麼? – syneptody 2011-12-15 15:31:52

回答

1

試試這個,

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

要用作Vendor構造函數的參數值本身賣方元素中的子元素:

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