На этот раз мы ищем узлы элементов. Когда такой узел найден, в цикле просматриваются все атрибуты и с помощью метода GetAttribute
значение атрибута загружается в listbox
.
Проверка
Если нужно проверить документ XML, используйте класс XmlValidatingReader
. Он обладает всей функциональностью класса XmlTextReader
(оба реализуют XmlReader
, но XmlValidatingReader
добавляет свойство ValidationType
, свойство Schemes
и свойство SchemaType
). Свойство ValidationType
задается как тип проверки, которую желательно выполнить. Допустимые значения этого свойства следующие:
Значение свойства | Описание |
---|---|
Auto | Если в
объявлен DTD, он и будет загружаться и обрабатываться. Атрибуты по умолчанию и общие сущности, определенные в DTD, станут доступными. Если найден атрибут XSD schemalocation , то загружается и обрабатывается XSD, при этом все атрибуты по умолчанию, определенные в схеме, будут возвращены. Если найдено пространство имен с префиксом MSXML x-schema: , загрузится и обработается схема XDR, все атрибуты, определенные по умолчанию, возвратятся. |
DTD | Проверка согласно правилам DTD. |
Schema | Проверка согласно правилам XSD. |
XDR | Проверка согласно правилам XDR. |
None | Проверка не выполняется. |
Если свойство задано, то должен быть назначен обработчик событий ValidationEventHandler
. Событие инициируется, когда случается ошибка проверки. На ошибку можно отреагировать любым подходящим образом. Рассмотрим пример. Добавим пространство имен схемы XDR (XML Data Reduced — приведенные данные XML) к файлу books.xml
и назовем этот файл booksVal.xml
. Теперь он выглядит так:
Отметим, что элемент bookstore
имеет теперь атрибут xmlns="x-schema:books.xdr"
. Это будет указывать на следующую схему XDR:
Отметим, что имеются два атрибута в файле 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);
}