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

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

Первый прототип Attributes
public static IEnumerable<XAttribute> Attributes ( 
  this IEnumerable<XElement> source)

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

Второй прототип Attributes
public static IEnumerable<XAttribute> Attributes ( 
      this IEnumerable<XElement> source, 
      XName name
)

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

Ниже показан пример использования первого прототипа Attributes:

XDocument xDoc = new XDocument(
             new XElement("Employees",
               new XElement("Employee",
                 new XAttribute("type", "Programmer"),
                 new XElement("FirstName", "Alex"), new XElement("LastName", "Erohin")),
               new XElement("Employee",
                 new XAttribute("type", "Editor"),
                 new XElement("FirstName", "Elena"), new XElement("LastName", "Volkova"))));

            // Получаем все элементы Employee
            IEnumerable<XElement> elements = xDoc.Element("Employees").Elements("Employee");

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

            // Отображаем атрибуты элемента
            foreach (XAttribute attr in elements.Attributes())
            {
                Console.WriteLine("Атрибут: {0} : значение = {1}",attr.Name, attr.Value);
            }

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

operatsiya-attributes-1

Как видите, атрибуты извлечены. Для демонстрации второго прототипа Attribute применяется тот же базовый пример, но на этот раз указывается имя, которому должны соответствовать атрибуты, возвращенные операцией Attributes:

...
// Отображаем атрибуты элемента
foreach (XAttribute attr in elements.Attributes("type"))
{
            Console.WriteLine("Атрибут: {0} : значение = {1}",attr.Name, attr.Value);
}

В приведенном коде указано, что атрибуты должны соответствовать имени type. Поэтому данный пример должен выдать тот же вывод, что и предыдущий, т.к. у элементов Employee в дереве XML отсутствуют другие атрибуты.

Если бы было указано имя Type с заглавной первой буквой, то эти два атрибута не были бы отображены, потому что операция Attributes не вернула бы их из входной последовательности. Это демонстрирует случай, когда соответствия имени нет, а также тот факт, что сопоставление имени чувствительно к регистру, что не удивительно, учитывая зависимость от регистра языка XML в целом.