Операция Attributes

40

Операция 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. Вот результат:

Вызов первого прототипа Attributes

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

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

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

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

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