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();
>}
Создадим новый файл