Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базовые технологии платформы .NET.docx
Скачиваний:
13
Добавлен:
03.11.2018
Размер:
614.46 Кб
Скачать

Пространства имён xml

Для описания пространства имён XML в LINQ to XML используется класс XNamespace. У этого класса нет открытого конструктора, но определено неявное приведение строки к XNamespace:

XNamespace ns = "http://astronomy.com/planet";

Чтобы указать на принадлежность имени к определённому пространству имён, следует использовать перегруженную версию оператора +, объединяющую объект XNamespace и строку в результирующий объект XName:

XElement jupiter = new XElement(ns + "name", "Jupiter");

// <name xmlns="http://astronomy.com/planet">Jupiter</name>

Префикс пространства имён устанавливается путём добавления в элемент атрибута специального вида. Если префикс задан, им заменяется любое указание пространства имён у дочернего элемента:

XElement planet = new XElement(ns + "planet",

new XAttribute(XNamespace.Xmlns + "p", ns));

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

Console.WriteLine(planet);

// <p:planet xmlns:p="http://astronomy.com/planet">

// <p:name>Jupiter</p:name>

// </p:planet>

19. ДОполнительные возможности обработки xml

В дополнение к LINQ to XML, платформа .NET содержит несколько программных интерфейсов для работы с XML. Для этого обычно используются классы из пространства имён System.Xml (и пространств вида System.Xml.*).

Классы XmlReader и XmlWriter ‑ это основа механизма последовательного чтения, обработки и записи XML-документов. Такой подход выгодно использовать, когда документ слишком велик, чтобы читать его в память целиком, или содержит ошибки в структуре.

Для последовательного чтения XML-документов применяется класс XmlReader и его наследники: XmlTextReader (чтение на основе текстового потока), XmlNodeReader (разбор XML из объектов XmlNode) и XmlValidatingReader (при чтении производится проверка схемы документа). Обычно для простого чтения XML достаточно класса XmlTextReader. Конструктор класса перегружен и позволяет создать объект на основе указанного файла или текстового потока:

var reader = new XmlTextReader("planets.xml");

Объект XmlTextReader извлекает XML-конструкции из потока при помощи метода Read()1. Тип текущей конструкции можно узнать, используя свойство NodeType, значениями которого являются элементы перечисления XmlNodeType. С конструкцией можно работать, используя различные свойства, такие как Name (возвращает имя элемента или атрибута), Value (возвращает данные элемента) и так далее.

В табл. 15 приведены некоторые значения перечисления XmlNodeType.

Таблица 15

Основные значения перечисления XmlNodeType

Значение

Пример

Attribute

units="days"

CDATA

<![CDATA[ This is CDATA info ]]>

Comment

<!-- первые четыре планеты -->

Document

<planets> (корневой элемент)

Element

<planet>

EndElement

</planet>

ProcessingInstruction

<?perl lower-to-upper-case ?>

Text

Mercury

Whitespace

\r \t \n (перевод строки, табуляция)

XmlDeclaration

<?xml version="1.0" encoding="utf-8" ?>

Следующий пример демонстрирует разбор XML-файла и вывод разобранных конструкций на экран:

var rdr = new XmlTextReader("planets.xml");

while (rdr.Read())

{

switch (rdr.NodeType) // реагируем в зависимости от NodeType

{

case XmlNodeType.XmlDeclaration:

Console.WriteLine("<?xml version='1.0'?>");

break;

case XmlNodeType.Element:

Console.WriteLine("<{0}>", rdr.Name);

break;

case XmlNodeType.Text:

Console.WriteLine(rdr.Value);

break;

case XmlNodeType.EndElement:

Console.WriteLine("</{0}>", rdr.Name);

break;

case XmlNodeType.Comment:

Console.WriteLine("<!--{0}-->", rdr.Value);

break;

}

}

Набор методов класса XmlTextReader, начинающихся с префикса Move (MoveToNextElement()), может использоваться для перехода к следующей XML-конструкции в потоке. Вернуться к просмотренным конструкциям нельзя.

Класс XmlWriter – это абстрактный класс для создания XML-данных. Подчеркнём, что XML-данные всегда могут быть сформированы в виде простой строки и затем записаны в любой поток. Однако такой подход не лишён недостатков ‑ возрастает вероятность неправильного формирования структуры XML из-за элементарных ошибок программиста. Класс XmlWriter и его наследники предоставляют более «помехоустойчивый» способ генерации XML-документа. В следующем примере применяется класс XmlTextWriter.

var message = "Hello, dude!";

var xw = new XmlTextWriter("greetings.xml", Encoding.UTF8)

{ Formatting = Formatting.Indented, Indentation = 2 };

xw.WriteStartDocument();

xw.WriteStartElement("greeting");

xw.WriteString(message);

xw.WriteEndElement();

xw.WriteEndDocument();

xw.Flush();

Классы XmlNode, XmlAttribute, XmlElement, XmlDocument служат для представления XML-документа в виде дерева объектов. Программный интерфейс, основанный на использовании данных классов, являлся предшественником LINQ to XML. В связи с этим ограничимся простым примером, демонстрирующим работу с указными классами:

public static void OutputNode(XmlNode node)

{

Console.WriteLine("Type= {0} \t Name= {1} \t Value= {2}",

node.NodeType, node.Name, node.Value);

if (node.Attributes != null)

{

foreach (XmlAttribute attr in node.Attributes)

{

Console.WriteLine("Type={0} \t Name={1} \t Value={2}",

attr.NodeType, attr.Name, attr.Value);

}

}

// если есть дочерние элементы, рекурсивно обрабатываем их

if (node.HasChildNodes)

{

foreach (XmlNode child in node.ChildNodes)

{

OutputNode(child);

}

}

}

// пример использования OutputNode()

var doc = new XmlDocument();

doc.Load("planets.xml");

OutputNode(doc.DocumentElement);