2015-08-27 4 views
0

Я пытаюсь написать LINQ to Objects/XML-запрос, который будет создавать объекты. I имеют класс, который имеет свойство IList от SomeModelClass. SomeModelClass также имеет несколько IList, которые необходимо заполнить из XML.LINQ to Objects - Назначить список свойства

Это первый раз, когда я попытался запросить несколько уровней вложенного XML, и я не уверен, как это сделать.

В настоящее время код не компилируется, поскольку select new, кажется, не в состоянии быть вложенным. Как я могу на самом деле запросить вложенный XML-объект для создания объекта, который имеет список объектов, который также имеет список строк?

Я показал код, который я попытался далеко.

У меня есть класс, как это:

public class MyClass 
{ 
    public string Name { get; set } 
    public IList<SomeModelClass> ModelList { get; set; } 
} 

И это мой класс модели:

public class SomeModelClass 
{ 
    public IList<string> MyList1 { get; set; } 
} 

XML-выглядит следующим образом:

<someXml> 
    <section name="test"> 
     <myModelClassXml> 
     <someValue value="string1" /> 
     <someValue value="string2" /> 
     <someValue value="string3" /> 
     </myModelClassXml> 
    </section> 

    <section name="test2"> 
     <myModelClassXml> 
     <someValue value="string1" /> 
     </myModelClassXml> 
    </section> 
    </someXml> 

И код у меня есть до сих пор:

var query = (from r in xdoc.Descendants("someXml").Descendants("section") 
       select new MyClass() 
       { 
        Name = r.Attribute("name").Value, 

        //Make list of SomeModelClass AND ALSO populate SomeModelClass's lists 
        select new SomeModelClass 
        { 
         MyList1 = What needs to be here? 
        } 

       }); 

ответ

1

Это должно дать вам правильный результат: -

List<MyClass> result = xdoc.Root.Descendants("section") 
      .Select(x => new MyClass 
       { 
        Name = (string)x.Attribute("name"), 
        ModelList = x.Elements("myModelClassXml") 
           .Select(y => new SomeModelClass 
        { 
         MyList1 = y.Elements("someValue") 
            .Select(z => (string)z.Attribute("value")).ToList() 
                   }).ToList() 
        }).ToList(); 

Сначала найдите все потомки section спроецировать его MyClass. Теперь, поскольку myModelClassXml является прямым дочерним до section, мы можем использовать Elements для дальнейшего получения элемента someValue и его атрибута значения.