C #, LINQ Получение дочерних элементов указанного родительского элемента - PullRequest
0 голосов
/ 04 ноября 2010

Надеюсь, это имеет смысл. У меня есть следующий документ XML.

<PrinterDirectory>
  <Country Name="UK>
    <Region Name="Aberdeen" />
    <Region Name="Birmingham" />
    <Region Name="London" />
  </Country>
  <Country Name="France">
    <Region Name="Paris" />
    <Region Name="Bordeaux" />
  </Country>
</PrinterDirectory>

Что такое LINQ, чтобы получить, например, только регионы Великобритании?

Я пробовал

varRegionQuery = from items in xdoc.Descendants("Country")
                 where items.Attribute("Name").Value == "UK"
                 select new
                 {
                    _Region = items.Element("Region").Attribute("Name").Value
                 };

Это, однако, только возвращает "Абердин".

Ответы [ 2 ]

6 голосов
/ 04 ноября 2010

Самый простой способ - это использовать последующее предложение from, например:

var regionQuery = from items in xdoc.Descendants("Country")
                  where items.Attribute("Name").Value == "UK"
                  from region in items.Elements("Region")
                  select region.Attribute("Name").Value;

Обратите внимание, что это справится с несколькими <Country Name="UK"> элементами.

1 голос
/ 08 ноября 2010
var regionQuery = from item in xdoc.Descendants("Country")
                              let countryCode = item.Attribute("Name") ?? new XAttribute("Name", string.Empty)
                              where countryCode.Value == "UK"
                              from region in item.Descendants("Region")
                              let regionName = region.Attribute("Name") ?? new XAttribute("Name", string.Empty)
                              select new {Name = regionName};

Пусть операторы удобны, если в вашем xml есть нулевое значение. Это позволяет нам собирать все данные, даже если некоторые из них являются недействительными, а затем мы можем справиться с удалением мусора позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...