Допустим, есть у нас такой XML файл “boks.xml”:
<bookstore>
<book publicationDate="2006" ISBN="number-1-861003-11-0">
<title>ASP.NET 2.0 </title>
<author>
<lastName>Dino</lastName>
<firstName>Ekspozito</firstName>
</author>
<price>30</price>
</book>
</bookstore>
Если по файлу xml кликнуть правой клавишей мыши и сказать открыть с помощью браузера, вот что получится:

Как видим, браузер вывел в таком виде, в каком мы его и написали. На самом деле, если убрать закрытие элемента price, браузер скажет, что допущена синтаксическая ошибка, но, это один этап проверки. Есть несколько вариантов указать свою проверку с помощью схем. В этой статье уделено
внимание применению DTD. С помощью DTD схем, мы можем полностью контролировать, сколько элементов может содержать узел, контролировать все вложенности, обязательно ли должны указываться атрибуты и т.д.. Вот полная схема, которая написана в том же файле XML, с полными комментариями.
<!-- bookstore - это корневой елемент-->
<!DOCTYPE bookstore [
<!--
bookstore может иметь елемент book.
* указывает что елементов book может быть сколько захотите
-->
<!ELEMENT bookstore (book)*>
<!--
book может иметь в себе елементы title, author, price.
? указывает что элементы title, author, price
могут быть или не быть,
но только в одном экземпляре
-->
<!ELEMENT book (title, author, price)?>
<!-- title может иметь любой текст -->
<!ELEMENT title (#PCDATA)>
<!-- author может иметь в себе элементы lastName, firstName. -->
<!ELEMENT author (lastName, firstName)?>
<!-- lastName может иметь любой текст -->
<!ELEMENT lastName (#PCDATA)>
<!-- firstName может иметь любой текст -->
<!ELEMENT firstName (#PCDATA)>
<!-- title может иметь любой текст -->
<!ELEMENT price (#PCDATA)>
<!--
ATTLIST используется для описаний атрибутов
REQUIRED - указывет что атрибут должен быть указан
укажыте IMPLEID, тем самым сказав что его можна опустить
атрибут publicationDate обязателен и может содержать символы
-->
<!ATTLIST book publicationDate CDATA #REQUIRED>
<!--
атрибут ISBN помечен как ID и он обязателен
Внимание! идентификатор должен начинатся с буквы!
-->
<!ATTLIST book ISBN ID #REQUIRED>
]
>
Важно понимать, что браузер проверяет лишь синтаксис, но с помощью DTD мы обеспечим более гибкий контроль над использованием XML. С такой схемой, программист на языке C# не сможет внести более одной записи title, author, price, lastName,
firstName, по сколку четко указано знак “?”, который означает 0 или 1.
Теперь работаем с языком программирования C#. Для выполнения проверки по DTD объект
XmlReader использует DTD, определенный в декларации DOCTYPE XML-документа. Декларация DOCTYPE может указывать на встроенный DTD или ссылаться на внешний DTD-файл.
- Задайте для свойства
XmlReaderSettings.DtdProcessing
значение DtdProcessing.Parse.
- Установите свойство XmlReaderSettings.ValidationType в значение
ValidationType.DTD.
В методе Main() пишем:
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse; // этап 1
settings.ValidationType = ValidationType.DTD; // этап 2
// подписываемся на событие
settings.ValidationEventHandler +=
new ValidationEventHandler(ValidationCallBack);
XmlReader reader = XmlReader.Create("books.xml", settings);
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
for (int i = 0; i < reader.AttributeCount; i++)
{
if (i == 0)
Console.Write("publication date = {0};\t",
reader.GetAttribute(i));
if (i == 1)
Console.Write("ISBN = {0};\n",
reader.GetAttribute(i));
}
}
else if (reader.NodeType == XmlNodeType.Text)
Console.WriteLine(reader.Value);
}
private static void ValidationCallBack(object sender,
ValidationEventArgs e)
{
Console.WriteLine("Документ xml не валидный!: {0}",
e.Message);
}
