Linq к вложенному запросу XML

У меня есть проблема, заставляя запрос LINQ работать. У меня есть этот 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. В данный момент мой код только заполняет первый интерфейс, любые последующие проигнорированы, и я не могу понять почему.

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

Удачи

5
задан user299342 22 March 2010 в 20:13
поделиться

2 ответа

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
  }

Основная идея здесь в том, что вы выполняете своего рода «подзапрос» на устройстве (которое является Потомком ), ища все элементы Интерфейса , которые оно содержит.

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

12
ответ дан 18 December 2019 в 14:44
поделиться

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

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")
                             }
            };
1
ответ дан 18 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: