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)));
}