Linq — получение корневых потомков

#c# #xml #linq

#c# #xml #linq

Вопрос:

Это XML-файл:

 <settings y="1" x="0">
    <prospect aksdj="sdf">
        <image path="images/1.jpg"/>
    </prospect>
    <prospect aksdfasdj="safafdf">
        <image path="images/2.jpg"/>
    </prospect>
</settings>
 

Я хочу получить обе строки с тегами изображений.

Мой код таков:

  XElement doc = XElement.Load(@"C:UsersJohnDesktopFile.xml");
 var result = (from c in doc.Descendants("settings")
                      select new
                      {
                          name = c.Element("prospect").Value
                      }).ToList();
 

Но, док.Потомки («настройки») равно нулю. Почему это значение равно нулю?

Комментарии:

1. Кстати, ваш образец XML поврежден — последняя строка должна быть закрывающим тегом. Насколько он репрезентативен для вашего реального файла?

2. Извините, когда я сократил файл, чтобы поместить его сюда, я по ошибке стер его : (

Ответ №1:

Вы загрузили элемент, который уже является <settings> элементом — у этого элемента нет <settings> потомков. ( Descendants null кстати, это не возвращает вам пустую последовательность. Есть большая разница.)

Если вы измените его на

 XDocument doc = XDocument.Load("...");
 

тогда все должно быть в порядке — или просто загрузите его как XElement и найдите <prospect> потомков, учитывая, что у вас все равно есть только один <settings> элемент…

Комментарии:

1. Я нашел потомков <prospect>, и все в порядке 🙂