Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб7.docx
Скачиваний:
10
Добавлен:
26.11.2019
Размер:
295.94 Кб
Скачать

1.3 Извлечения значения элемента

Получить значения элементов можно двумя основными способами. Первый способ состоит в приведении XElement или XAttribute к желаемому типу. Оператор явного преобразования, который преобразует содержимое элемента или атрибута в указанный тип и присваивает полученное значение указанной переменной. Иначе можно использовать свойство XElement.Value или XAttribute.Value.

При использовании C# приведение, как правило, является лучшим подходом. Для получения значения элемента нужно просто привести объект XElement к желаемому типу. Всегда можно привести элемент к строке следующим образом.

XElement e = new XElement("StringElement", "abcde");

Console.WriteLine(e);

Console.WriteLine("Value of e:" + (string)e);

 

Этот пример выводит следующие данные.

abcde

Value of e:abcde

 

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

XElement e = new XElement("Age", "44");

Console.WriteLine(e);

Console.WriteLine("Value of e:" + (int)e);

 

Этот пример выводит следующие данные.

44

Value of e:44

 

LINQ to XML предусматривает операторы явного приведения для следующих типов данных: string, bool, bool?, int, int?, uint, uint?, long, long?, ulong, ulong?, float, float?, double, double?, decimal, decimal?, DateTime, DateTime?, TimeSpan, TimeSpan?, GUID и GUID?.

LINQ to XMLпредоставляет аналогичные операторы приведения для объектов XAttribute.

Свойство Value может использоваться для получения содержимого элемента.

XElement e = new XElement("StringElement", "abcde");

Console.WriteLine(e);

Console.WriteLine("Value of e:" + e.Value);

 

Этот пример выводит следующие данные:

<StringElement>abcde

Value of e:abcde

Для доступ к элементам документа используются методы документа и элемента:

  • Element(имя_элемента)

  • Elements()  - все дочерние (но не все потомки)

  • Elements(имя_элемента) - все дочерние с данным именем.

Два последних  метода возвращают последовательности.

    var e = doc.Element("books"); // the root element

   var e1 = e.Element("book").Element("author");

 

Замечание. Метод Elements() является сокращением для  Nodes(). OfType<XElement>().

Свойствами-последовательностями можно воспользоваться для прохождения по дереву.

       static void Go(XElement el, string shift) {

         Console.WriteLine(shift + el.Name);

         foreach (var e in el.Elements()) {

            Go(e, shift + "   ");

         }

      }

 

Атрибуты элемента можно получить при помощи свойств Attribute() и Attributes().

 

var year =

  (int)doc.Element("books").Element("book").Attribute("year");

 

Пример. Перейти от XML к коллекции книг

Класс Book.

   class Book

   {

      public string Title { set; get; }

      public IEnumerable<string> Authors { set; get; }

      public int Year { set; get; }

   }

 

Метод построения коллекции книг.

 

   public static IEnumerable<Book> FromXml(XDocument doc) {

      return from b in doc.Element("books").Elements("book")

               select new Book {

                  Title = (string)b.Element("title"),

                  Year = (int)b.Attribute("year"),

                  Authors = from a in b.Elements("author")

                           select (string)a

               }

   }

 

Пример. Перейти от коллекции книг к XML

 

public static XElement FromBooks(IEnumerable<Book> books) {

   return new XElement("books",

      from b in books select new XElement("book",

         new XAttribute("year", b.Year),

         new XElement("title", b.Title),

         from a in b.Authors select new XElement("author", a)));

}