Операция Nodes

46

Операция Nodes может быть вызвана на последовательности элементов или документов и возвращает последовательность узлов, содержащих дочерние узлы каждого исходного элемента или документа.

Эта операция отличается от операции DescendantNodes тем, что Nodes возвращает только непосредственных потомков — дочерние элементы каждого элемента входной последовательности, в то время как операция DescendantNodes рекурсивно возвращает все дочерние узлы, пока не достигнет конца дерева.

Операция Nodes имеет один прототип, описанный ниже:

public static IEnumerable<XNode> Nodes<T> (
   this IEnumerable<T> source 
   ) where T : XContainer

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

В отличие от метода XContainer.Nodes этот метод вызывается на последовательности элементов или документов, а не на отдельном элементе или документе.

В приведенном ниже примере строится типичное дерево XML и исходная последовательность элементов Element, которые сразу отображаются. После чего извлекаются и отображаются дочерние узлы каждого исходного элемента:

XDocument xDoc = new XDocument(
             new XElement("Employees",
               new XComment("Список сотрудников"),
               new XElement("Employee",
                 new XAttribute("type", "Programmer"),
                 new XComment("Это программист"),
                 new XElement("FirstName", "Alex"), 
                 new XElement("LastName", "Erohin")),
               new XElement("Employee",
                 new XAttribute("type", "Editor"),
                 new XElement("FirstName", "Elena"), new XElement("LastName", "Volkova"))));

            IEnumerable<XElement> elements =
                  xDoc.Element("Employees").Elements("Employee");

            //  Сначала отобразим все исходные элементы
            foreach (XElement e in elements)
            {
                Console.WriteLine("Исходные элемент: {0} : значение = {1}", e.Name, e.Value);
            }

            Console.WriteLine();

            //  Теперь отобразим дочерние узлы каждого исходного элемента
            foreach (XNode node in elements.Nodes())
            {
                Console.WriteLine("Дочерний узел: {0}", node);
            }

Поскольку эта операция возвращает дочерние узлы, а не элементы, выходная последовательность будет включать в результате комментарий из первого элемента Employee:

Вызов единственного прототипа Nodes

В результатах присутствуют все дочерние узлы каждого исходного элемента. Обратите внимание, что поскольку извлекаются только непосредственные дочерние узлы, узлы XText, являющиеся дочерними по отношению к каждому элементу FirstName и LastName, не были получены, как это было в примере операции DescendantNodes в одной из предыдущех статей.

Пройди тесты
Лучший чат для C# программистов