Чтение онлайн

на главную - закладки

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

protected void button1_Click (object sender, System.EventArgs e) {

 //измените это в соответствии с используемой структурой путей доступа.

 string filename = "..\\..\\..\\booksVal.xml";

 XmlTextReader tr = new XmlTextReader(filename);

 XmlValidatingReader trv=new XmlValidatingReader(tr);

 // Задать тип проверки

 trv.ValidationType=ValidationType.xdr;

 // Добавить обработчик события проверки

 trv.ValidationEventHandler += new ValidationEventHandler(this.ValidationEvent);

 // Считываем узел за раз

 while(trv.Read) {

if (trv.NodeType == XmlNodeType.Text) listBox1.Items.Add(trv.Value);

 }

}

public void ValidationEvent(object sender, ValidationEventArgs args) {

 MessageBox.Show(args.Message);

}

Мы

создаем
XmlTextReader
для передачи в
XmlValidationReader
. Когда
XmlValidationReader trv
создан, можно использовать его по большей части так же, как
XmlTextReader
в предыдущих примерах. Различия состоят в том что в данном случае определен атрибут
ValidationType
и добавлен
ValidationEventHandler
. Каждый раз при возникновении ошибки проверки инициируется
ValidationEvent
. Затем можно будет обработать ошибку проверки любым приемлемым способом. В данном примере выводится
MessageBox
с описанием ошибки. Вот как выглядит
MessageBox
, когда инициируется
ValdationEvent
.

В отличие от некоторых синтаксических анализаторов

XmlValidationReader
после возникновения ошибки продолжает считывание. Имеется возможность определить серьезность ошибки проверки. Если окажется, что это серьезная ошибка, то можно остановить чтение.

Свойство

Schemas
класса
XmlValidationReader
содержит коллекцию
XmlSchemaCollection
, которая находится в пространстве имен
System.Xml.Schema
. В этой коллекции находятся предварительно загруженные схемы XSD и XDR, что позволяет выполнить очень быструю проверку, (особенно, если нужно проверить несколько документов), так как схему не нужно каждый раз перезагружать. Для получения выигрыша в производительности и создается объект
XmlSchemaCollection
. Метод
Add
имеет четыре перегружаемые версии. Можно передать объект на основе
XmlSchema
, объект на основе
XmlSchemaCollection
, строку
string
с пространством имен вместе со строкой
string
с URL файла схемы и, наконец, строку
string
с пространством имен и объектом на основе
XmlReader
, который содержит схему.

Запись XML

Класс

XmlTextWriter
позволяет записывать XML в поток, файл или объект
TextWriter
. Подобно
XmlTextReader
он делает это только вперед, некэшируемым образом.
XmlTextWriter
можно конфигурировать различным образом, что позволяет определить такие вещи, как наличие или отсутствие отступов, величину отступа, какой использовать символ кавычки в значениях атрибутов, и поддерживаются ли пространства имен. Свойство
DataTypeNamespace
определяет, как строго значения типов преобразуются в текст XML. Для этого свойства допустимо значение
urn:schemas-microsoft-com:datatypes
, которое поддерживает типы данных XDR, и другое значение www.w3.org/1999/XMLSchema-data-types, которое является схемой W3C типов данных XSD. Чтобы использовать, например, тип данных
TimeSpan
, необходимо будет задать это свойство для типов данных XSD.

Приведем простой пример, чтобы увидеть, как может использоваться класс

TextWriter
(пример находится в папке
XMLWriterSample1
):

private void button1_Click(object sender, System.EventArgs e) {

 // измените в соответствии с используемой структурой
путей доступа

 string fileName="..\\..\\..\\booknew.xml";

 //создайте XmlTextWriter

 XmlTextWriter tw=new XmlTextWriter(fileName, null);

 // задайте форматирование с отступом

 tw.Formatting=Formatting.Indented;

 tw.WriteStartDocument;

 //Начать создание элементов и атрибутов

 tw.WriteStartElement("book");

 tw.WriteAttributeString("genre", "Mystery");

 tw.WriteAttributeString("publicationdate", "2001");

 tw.WriteAttributeString("ISBN", "123456789");

 tw.WriteElementString("title", "Case of the Missing Cookie");

 tw.WriteStartElement("author");

 tw.WriteElementString("name", "Cookie Monster");

 tw.WriteEndElement;

 tw.WriteElementString("price", "9.99");

 tw.WriteEndElement;

 tw.WriteEndDocument;

 // очистить

 tw.Flush;

 tw.Close;

}

Создадим новый файл

booknew.xml
и добавим новую книгу. Объект
XmlTextWriter
заменит существующий файл. Вставку нового элемента или узла в существующий документ рассмотрим позже. Экземпляр объекта
XmlTextWriter
создается с помощью объекта
FileStream
в качестве параметра. Можно также передать строку с именем файла и путем доступа или объект на основе
TextWriter
. При задании свойства
Indenting
узлы-потомки будут автоматически делать отступ от предка. Метод
WriteStartDocument
помещает объявление документа. Начинаем запись данных. Сначала идет элемент
book
. Затем добавляем атрибуты
genre
,
publicationdate
и
ISBN
. После чего записываем элементы
title
,
author
, и price. Отметим, что элемент
author
имеет элемент-потомок
name
.

После нажатия на кнопку будет создан следующий файл

booknew.xml
:

<?xml version="1 .0"?>

<book genre= "Mystery" publicationdate="2001" ISBN="123456789">

 <title>Case of the Missing Cookie</title>

 <author>

<name>Cookie Monster</name>

 </author>

 <price>9,99</price>

</book>

Так же как в документе XML, здесь имеются начальный метод и конечный метод (

WriteStartElement
и
WriteEndElement
). Вложенность контролируется отслеживанием начала и окончания записи элементов и атрибутов. Это можно видеть при добавлении элемента потомка
name
к элементу
authors
. Отметим, как организуются вызовы методов
WriteStartElement
и
WriteEndElement
и как это связывается с выведенным документом XML.

В дополнение к

WriteElementString
и
WriteAtributeString
имеется несколько других специализированных методов записи. Метод
WriteCDate
будет выводить раздел
CDate (<!CDATE[...]]>)
, взяв текст для записи из параметра. WriteComment записывает комментарий в подходящем формате XML. WriteChars записывает содержимое символьного буфера. Это работает аналогично методу
ReadChars
, который был рассмотрен ранее. Оба они используют один и тот же тип параметров. Методу
WriteChar
нужен буфер (массив символов), начальная позиция для записи (целое значение) и число символов для записи (целое значение).

Поделиться:
Популярные книги

Скандальная свадьба

Данич Дина
1. Такие разные свадьбы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Скандальная свадьба

Орден Багровой бури. Книга 5

Ермоленков Алексей
5. Орден Багровой бури
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Орден Багровой бури. Книга 5

Адвокат Империи 7

Карелин Сергей Витальевич
7. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 7

АН (цикл 11 книг)

Тарс Элиан
Аномальный наследник
Фантастика:
фэнтези
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
АН (цикл 11 книг)

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Вспоминай меня ночью

Рам Янка
Любовные романы:
современные любовные романы
эро литература
5.60
рейтинг книги
Вспоминай меня ночью

Адвокат вольного города 3

Кулабухов Тимофей
3. Адвокат
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Адвокат вольного города 3

На границе империй. Том 9. Часть 5

INDIGO
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5

Адвокат вольного города 4

Кулабухов Тимофей
4. Адвокат
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Адвокат вольного города 4

Земная жена на экспорт

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Земная жена на экспорт

Варлорд

Астахов Евгений Евгеньевич
3. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Варлорд

Баронесса. Эхо забытой цивилизации

Верескова Дарья
1. Проект «Фронтир Вита»
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Баронесса. Эхо забытой цивилизации

Неудержимый. Книга XVII

Боярский Андрей
17. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVII

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений