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

стр.

>

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

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

>}

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