2011-12-15 3 views
0

У меня есть следующий XMLКачели и пропустить LINQ для запроса 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. Запрос, который я до сих пор производит такой вывод:

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 и помощь чрезвычайно ценится!

Update: Фактическое решение

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

Try это,

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(); 
Смежные вопросы