Использование LINQ в XML для сопоставления более глубоких элементов-потомков?

#c# #linq-to-xml #descendant

#c# #linq-to-xml #потомок

Вопрос:

Предположим, у меня есть следующий XML-файл:

 <?xml version="1.0" encoding="UTF-8"?>
<response>
  <project>
    <ixGroup>105</ixGroup>
    <sGroup>Place Group</sGroup>
  </project>
  <project>
    ...
  

И я использую следующий код для извлечения из него различных <ixGroup> и <sGroup> текстовых значений:

 XDocument doc = XDocument.Load(@"C:tempxmlParse2.xml");

var projects = (from project in doc.Descendants("project")
                select new {
                    id = project.Element("ixGroup").Value,
                    name = project.Element("sGroup").Value
                }).Distinct();

foreach(var project in projects)
{
    project.id.Dump("id");
    project.name.Dump("name");
}
  

Если бы в том же XML-файле был дополнительный элемент, подобный <projects> добавленному ниже:

 <response>
  <projects>
    <project>
      <ixGroup>105</ixGroup>
      <sGroup>Place Group</sGroup>
    </project>
    <project>
      ...
  

Как бы мне изменить приведенный выше код LINQ, чтобы по-прежнему получать доступ к <project> элементам?

Ответ №1:

Вам не пришлось бы. Я только что протестировал это, и ваш текущий оператор LINQ все равно вернет все <project> элементы, независимо от того, вложены ли они в <projects> элемент.

Ответ №2:

Вам вообще не нужно изменять свой код. Descendants Метод будет искать как можно дальше по дереву, чтобы найти соответствующие элементы, что может быть как проклятием, так и благословением. В вашем случае написанный код продолжит работать, даже если вы добавите промежуточный <projects> узел.

(Метод, который выполняет поиск только прямых дочерних методов, является Children() .

Ответ №3:

Элементы ищут только дочерние узлы, но потомки проходят весь путь вниз по дереву. Другими словами, вам не придется ничего делать.