Курс лекций для студентов специальности i-31 03 04 Информатика всех форм обучения Минск 2010


Запросы, модификация и трансформация XML



страница15/29
Дата09.08.2019
Размер0.64 Mb.
#126834
ТипКурс лекций
1   ...   11   12   13   14   15   16   17   18   ...   29

Запросы, модификация и трансформация XML


Рассмотрим набор методов и свойств, используемых в LINQ to XML при выборке данных. Класс XObject имеет свойство NodeType для типа XML-узла и свойство Parent, указывающее, какому элементу принадлежит узел.

Методы классов XNode и XContainer позволяют получить у элемента наборы предков и дочерних узлов (элементов). При этом возможно указание фильтра – имени элемента. Большинство методов возвращают коллекции, реализующие IEnumerable1.

// методы выборки у XNode

public IEnumerable Ancestors(); // + XName name

public IEnumerable ElementsAfterSelf(); // + XName name

public IEnumerable ElementsBeforeSelf(); // + XName name

public bool IsAfter(XNode node);

public bool IsBefore(XNode node);

public IEnumerable NodesAfterSelf();

public IEnumerable NodesBeforeSelf();


// методы выборки у XContainer

public IEnumerable DescendantNodes();

public IEnumerable Descendants(); // + XName name

public XElement Element(XName name);

public IEnumerable Elements(); // + XName name

Класс XDocument позволяет получить корневой элемент при помощи свойства Root. В классе XElement есть методы для запроса элементов-предков и элементов-потомков, а также методы для запроса атрибутов.

// методы выборки у XElement

public IEnumerable AncestorsAndSelf(); // + XName name

public XAttribute Attribute(XName name);

public IEnumerable Attributes(); // + XName name

public IEnumerable DescendantNodesAndSelf();

public IEnumerable DescendantsAndSelf(); // + XName name

Статический класс Extensions определяет несколько методов расширения, работающих с коллекциями элементов или узлов XML:

IEnumerable Ancestors(...) where T: XNode;

IEnumerable AncestorsAndSelf(...);

IEnumerable Attributes(...);

IEnumerable DescendantNodes(...) where T: XContainer;

IEnumerable DescendantNodesAndSelf(...);

IEnumerable Descendants(...) where T: XContainer;

IEnumerable DescendantsAndSelf(...);

IEnumerable Elements(...) where T: XContainer;

IEnumerable InDocumentOrder(...) where T: XNode;

IEnumerable Nodes(...) where T: XContainer;

void Remove(this IEnumerable source);

void Remove(this IEnumerable source) where T: XNode;

Продемонстрируем примеры запросов, используя файл planets.xml с описанием четырёх планет. Загрузим файл и выведем имена планет:

var xml = XDocument.Load("planets.xml");

var query = xml.Root.Elements("planet").Select(p =>

p.Element("name").Value);

foreach (var x in query) Console.WriteLine(x);

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

var moons = xml.Descendants("moon").Select(p => p.Element("name"));

Найдём элемент, содержащий указанный текст:

var phobos = xml.DescendantNodes().OfType()

.Where(t => t.Value == "Phobos")

.Select(t => t.Parent);

Модификация XML-информации в памяти выполняется при помощи следующих методов классов XNode, XContainer, XElement:1

// методы модификации у XNode

public void AddAfterSelf(object content); // + params

public void AddBeforeSelf(object content); // + params

public void Remove();

public void ReplaceWith(object content); // + params


// методы модификации у XContainer

public void Add(object content); // + params

public void AddFirst(object content); // + params

public void RemoveNodes();

public void ReplaceNodes(object content); // + params
// методы модификации у XElement

public void RemoveAll();

public void RemoveAttributes();

public void ReplaceAll(object content); // + params

public void ReplaceAttributes(object content); // + params

public void SetAttributeValue(XName name, object value);

public void SetElementValue(XName name, object value);

Рассмотрим несколько примеров модификации XML. Начнём с удаления заданных узлов. Для этого используем метод расширения Remove():

var xml = XDocument.Load("planets.xml");

xml.Element("planets").Elements("planet").Elements("moon").Remove();

Продемонстрируем добавление и замену элементов:

var p = XDocument.Load("planets.xml").Root;

p.Add(new XElement("planet", new XElement("name", "Jupiter")));

var moon = p.Descendants("moon").First();

moon.ReplaceWith(new XElement("DeathStar"));

Покажем добавление атрибута к элементу:

XElement sun = xml.Element("planets");

sun.Add(new XAttribute("MassOfSun", "332.946 Earths"));

Функциональные конструкторы и поддержка методами выборки коллекций открывают богатые возможности трансформации наборов объектов в XML. В следующем примере показано создание XML-документа на основе коллекции студентов gr (см. параграф 2.14):

var xml = new XElement("students",

from student in gr

select new XElement("student",

new XAttribute("name", student.Name),

new XAttribute("age", student.Age),

from mark in student.Marks

select new XElement("mark", mark)));

Хотя предыдущий пример использует отложенный оператор Select(), полная итерация по набору выполняется конструктором класса XElement. Если необходимо отложенное конструирование XML-элементов, следует воспользоваться классом XStreamingElement.

string[] names = {"John", "Paul", "George", "Pete"};

var xml = new XStreamingElement("Beatles",

from n in names

select new XStreamingElement("name", n));

names[3] = "Ringo";

Console.WriteLine(xml); // Ринго заменил Пита Беста


Каталог: images
images -> В списке студентов (или магистрантов)
images -> Н. И. Сулейманов Комплект контрольно-оценочных средств для оценки результатов освоения профессионального модуля разработан на основе Федерального государственного образовательного стандарта среднего профессионального
images -> По направлению подготовки
images -> Добавить гаджеты. Добавление гаджетов
images -> Техническое задание № apnip/C. 2/CS/Ind/01 Международный консультант по улучшенной производительности орошаемого земледелия
images -> Комплект контрольно-оценочных средств по профессиональному модулю пм. 01 Техническое обслуживание и ремонт автотранспорта


Поделитесь с Вашими друзьями:
1   ...   11   12   13   14   15   16   17   18   ...   29




База данных защищена авторским правом ©vossta.ru 2022
обратиться к администрации

    Главная страница