- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания C# для профессионалов. Том II - Симон Робинсон
Шрифт:
Интервал:
Закладка:
</group>
<group order="seq">
<element type="first-name"/>
<element type="last-name"/>
</group>
</ElementType>
<ElementType name="title" content="textOnlу" />
<AttributeType name="genre" dt:type="string"/>
<ElementType name="book" content="eltOnly">
<attribute type="genre" required="yes"/>
<element type="title"/>
<element type="author"/>
<element type="price"/>
</ЕlementType>
<ElementType name="bookstore" content="eltOnly">
<element type="book"/>
</ElementType>
</Schema>
Отметим, что имеются два атрибута в файле XML, которые не определены в схеме. Если посмотреть внимательно, то можно увидеть что в схеме нет атрибутов publication-date и ISBN из элемента book. Мы сделали это, чтобы показать, что проверка действительно выполняется. Можно использовать для подтверждения этого следующий код. Необходимо будет добавить в класс using System.Xml.Schema. Весь код доступен в XMLReaderSample5:
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 нужен буфер (массив символов), начальная позиция для записи (целое значение) и число символов для записи (целое значение).
Чтение и запись XML с помощью классов, основанных на XMLReader и XMLWriter, осуществляются очень просто. Далее мы рассмотрим реализацию DOM пространства имен System.Xml. Это классы на основе XmlDocument и XmlNode.
Объектная модель документа в .NET
Реализация объектной модели документа (DOM, Document Object Model) в .NET поддерживает спецификации W3C DOM Level 1 и Core DOM Level 2. DOM реализуется с помощью класса XmlNode. XmlNode является абстрактным классом, который представляет узел документа XML. XmlNodeList является упорядоченным списком узлов. Это живой список узлов, и любые изменения в любом узле немедленно отражаются в списке. XmlNodeList поддерживает индексный доступ или итеративный доступ. Эти два класса составляют основу реализации DOM на платформе .NET. Вот список классов, которые основываются на XmlNode.
Имя класса Описание XmlLinkedNode Расширяет XmlNode. Возвращает узел непосредственно перед или после текущего узла. Добавляет свойства NextSibling и PreviousSibling в XmlNode. XmlDocument Расширяет XmlNode. Представляет весь документ. Реализует спецификации DOM Level 1 и Level 2. XmlAttribute Расширяет XmlNode. Объект атрибута объекта XmlElement. XmlCDataSection Расширяет XmlCharacterData. Объект, который представляет раздел документа CData. XmlCharacterData Абстрактный класс, который предоставляет методы манипуляции с текстом для других классов. Расширяет XmlLinkedNode. XmlComment Расширяет XmlCharacterData. Представляет объект комментария XML. XmlDeclaration Расширяет XmlLinkedNode. Представляет узел объявления (<?xml version='1.0' ...>) XmlDocumentFragment Расширяет XmlNode. Представляет фрагмент дерева документа. XmlDocumentType Расширяет XmlLinkedNode. Данные, связанные с объявлением типа документа. XmlElement Расширяет XmlLinkedNode. Объект элемента XML. XmlEntity Расширяет XmlNode. Синтаксически разобранный или неразобранный узел сущности. XmlEntityReferenceNode Расширяет XmlLinkedNode. Представляет ссылочный узел сущности XmlNotation Расширяет XmlNode. Содержит нотацию, объявленную в DTD или в схеме. XmlProcessingInstruction Расширяет XmlLinkedNode. Содержит инструкцию обработки XML. XmlSignificantWhitespace Расширяет XmlCharacterData. Представляет узел с разделителем. Узлы создаются, только если флаг PreserveWhiteSpace задан как true. XmlWhitespace Расширяет XmlCharacterData. Представляет разделитель в содержимом элемента. Узлы создаются, только если флаг PreserveWhiteSpace задан как true. XmlText Расширяет XmlCharacterData. Текстовое содержимое элемента или атрибута.Как можно видеть .NET делает доступным класс, соответствующий почти любому типу XML. Мы не будем рассматривать каждый класс подробно, но разберем несколько примеров. Вот как выглядит диаграмма наследования: