2010-03-22 2 views
5

У меня возникла проблема с поиском запроса LINQ. У меня есть этот XML:Linq to XML вложенный запрос

<devices> 
    <device id ="2142" name="data-switch-01"> 
    <interface id ="2148" description ="Po1"/> 
    </device> 
    <device id ="2302" name="data-switch-02"> 
    <interface id ="2354" description ="Po1"/> 
    <interface id ="2348" description ="Gi0/44" /> 
    </device> 
</devices> 

И этот код:

var devices = from device in myXML.Descendants("device") 
       select new 
       { 
        ID = device.Attribute("id").Value, 
        Name = device.Attribute("name").Value, 
       }; 

foreach (var device in devices) 
{ 
    Device d = new Device(Convert.ToInt32(device.ID), device.Name); 

    var vIfs = from vIf in myXML.Descendants("device") 
        where Convert.ToInt32(vIf.Attribute("id").Value) == d.Id 
        select new 
        { 
         ID = vIf.Element("interface").Attribute("id").Value, 
         Description = vIf.Element("interface").Attribute("description").Value, 
        }; 
    foreach (var vIf in vIfs) 
    { 
     DeviceInterface di = new DeviceInterface(Convert.ToInt32(vIf.ID), vIf.Description); 
     d.Interfaces.Add(di); 
    } 

    lsDevices.Add(d); 
} 

Мой объект Устройство содержит список DeviceInterfaces, которые мне нужно заполнить из XML. В настоящий момент мой код заполняет только первый интерфейс, любые последующие игнорируются, и я не могу понять, почему.

Я также благодарен за любые комментарии относительно того, является ли это правильным путем. Вложенный цикл просмотр, кажется, немного неаккуратно мне

Приветствия

ответ

12
IEnumerable<Device> devices = 
    from device in myXML.Descendants("device") 
    select new Device(device.Attribute("id").Value, device.Attribute("name").Value) 
    { 
    Interfaces = (from interface in device.Elements("Interface") 
        select new DeviceInterface(
         interface.Attribute("id").Value, 
         interface.Attribute("description").Value) 
       ).ToList() //or Array as you prefer 
    } 

Основной момент здесь является то, что вы делаете что-то вроде «подвыборки» на устройстве (которое является Descendant), ищут все Interface элементов что он содержит.

Он создает новый DeviceInterface для каждого «интерфейса» под каждым устройством.

+0

Спасибо, что выглядит намного лучше, я дам ему выстрелили позже :) – user299342

+0

Yep, что это пятно на, ура! – user299342

1

Быстрый и грязный

var query = from device in document.Descendants("device") 
      select new 
      { 
       ID = device.Attribute("id").Value, 
       Name = device.Attribute("name").Value, 
       Interfaces = from deviceInterface in device.Descendants("interface") 
          select new 
          { 
           ID = deviceInterface.Attribute("id").Value, 
           Description = deviceInterface.Attribute("description") 
          } 
      }; 
+0

Вам все равно нужно перебирать 'query' для создания (или заполнения)' List '(см.' LsDevices' в опубликованном коде). –

Смежные вопросы