2014-12-08 2 views
0

Образец ниже разбор документа XML, то зацикливание через член и хранить их в списке объектов (данные в конечном счете заканчивается в базе данных SQL):C# Перебором вложенной LINQ выберите заявления

public static void Parse(XDocument xml) 
{ 
    XNamespace ns = "http://somenamespace.com/ns"; 

    var Locations = 
     from Continents in xml.Descendants(ns + "Continent") 
     from Countries in Continents.Elements(ns + "Country") 
     select new 
     { 
      Continent1 = (string) Continents.Element(ns + "Europe"), 
      Country1 = (string) Countries.Element(ns + "United_Kingdom"), 
      Cities = from Cities in Countries.Elements(ns + "City") 
       select new 
       { 
        City1 = (string) Cities.Element(ns + "London") 
       } 
     }; 

    List<Location> locationColl = new List<Location>(); 

    loc_Entity_FrameworkContainer context = new loc_Entity_FrameworkContainer(); 

    var i = 0; 

    foreach (var location in Locations) 
    { 
     Location l = new Location(); 
     locationColl.Add(l); 

     locationColl[i].Continent = (string) location.Continent1; 
     locationColl[i].Country = (string) location.Country1; 
     locationColl[i].City = (string) location.City1; // Can't access "City1" 

     context.Location.Add(locationColl[i]); 
     i++; 
    } 

    context.SaveChanges(); 
} 

Заявление: locationColl[i].City = (string)location.City1; не находит «City1». (Это вопрос, я не могу получить доступ ко всем членам из "Места" в одном цикле)

Расположение Класс:

namespace locationProject 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Location 
    { 
     public string Continent { get; set; } 
     public string Country { get; set; } 
     public string City { get; set; } 
    } 
} 

XML Пример:

<?xml version="1.0" encoding="UTF-8"?> 
<feed xmlns:ns="http://somenamespace.com/ns"> 
    <ns:Continent> 
     <ns:Europe>21c99a56-4b3d-4571-802a-76cdb6b81a01</ns:Europe> 
     <ns:Country> 
     <ns:United_Kingdom>eb2e9eec-dc3b-4636-bcf5-dba0024e62f3</ns:United_Kingdom> 
     <ns:City> 
      <ns:London>109b48ec-d829-4a87-b200-4dc9a94db48c</ns:London> 
     </ns:City> 
     </ns:Country> 
    </ns:Continent> 
    <ns:Continent> 
     <ns:Europe>a11ed925-dc0d-4dfd-b1c2-52eb697ad689</ns:Europe> 
     <ns:Country> 
     <ns:United_Kingdom>a61d02ef-7b80-4390-926a-49c6d9af9634</ns:United_Kingdom> 
     <ns:City> 
      <ns:London>dbb9c5cc-b08f-4223-b32c-acb4ed9ce97c</ns:London> 
     </ns:City> 
     </ns:Country> 
    </ns:Continent> 
</feed> 

Пытаюсь найти способ циклического перемещения по всем элементам (Continent1, Country1, City1), который не включает несколько циклов и не разбивает вложенную структуру операторов LINQ.

Есть вопросы, похожие на этот, но я не нашел тот, который я хорошо понимаю, чтобы интегрироваться с моим кодом.

Большое спасибо!

+0

Вы можете разместить код для класса 'Location' и пример вашего xml? – juharr

+0

Если вы поделитесь своей структурой XML, возможно, люди смогут предоставить более полные и полные ответы. – Michael

+0

Добавлен класс Location и XML-пример. – Cryptonaut

ответ

1

Ваш анонимный тип, содержащийся в списке Расположения имеет .Cities свойство, которое содержит City1 элемент:

Cities = from Cities in Countries.Elements(ns + "City") 
    select new 
    { 
     City1 = (string) Cities.Element(ns + "London") 
    } 

Попробуйте это:

var Locations = 
    from Continents in xml.Descendants(ns + "Continent") 
    from Countries in Continents.Elements(ns + "Country") 
    from Cities in Countries.Elements(ns + "City") 
    select new 
    { 
     Continent1 = (string) Continents.Element(ns + "Europe"), 
     Country1 = (string) Countries.Element(ns + "United Kingdom"), 
     City1 = (string) Cities.Element(ns + "London") 
    }; 
+0

Спасибо за ваш ответ. Этот метод позволяет мне сохранить все элементы в одном цикле, однако, если, например, Континент не содержит элемент «Страна» или «Город», он не вернет этот Континент. Вложенная структура LINQ, которую я использую, по-прежнему возвращает Континент, даже если этот Континент не содержит страну или город. Итак, вопрос в том, как сохранить вложенную структуру LINQ и получить доступ ко всем ее членам за один цикл? – Cryptonaut

+0

@Cryptonaut Просто используйте несколько циклов. Здесь явно гарантировано. В то время как вы * можете * технически избегать этого, вы делаете только что-то труднее для вас, чтобы это сделать. – Servy

+0

@Servy Даже так, как мне получить доступ к вложенным членам в другом цикле? – Cryptonaut

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