Парсер xml — это по сути програмный анализатор (синтаксический разборщик) xml документа. Задача парсера — прочитать документ с данными и как-то его представить пользователю (например, чтобы его можно было внести в базу данных или модифицировать).
В XML на сегодня есть 2 подхода к разбору документа: SAX и DOM. Дополнительно информацию о них ищите на сайте через форму поиска.
SAX — Simle API of XML, простой api для работы с xml файлами, довольно примитивный, но зато быстрый.
DOM — Document Object Model. На сегодня самый распространенный и продвинутый.
DOM парсер
На входе получает какой-то документ с данными, а на выходе выдает дерево объектов.
Когда мы работаем с xml, к нам в парсер могут приходить совершенно разные документы. И иногда бывает документ не для нас, и просто обработать его dom парсером будет неправильно (документ может быть неполным, не все указано, не та структура, некорректные данные). И нам надо отсеять все это на этапе обработки, т.е. т.н. валидация документа. Т.е. надо определить грамматику входящего xml документа.
И поэтому разработчики пошли по принципу декларативности: пусть парсер сам проверяет документ. Т.е. парсеру описывается набор правил, как должно быть, а он должен проверять, насколько данный документ похож, как должно быть. Среди таких описаний выделяют DTD. Рассмотрим ниже.
Описания DTD — Document Type Definition (определения типов документов)
DTD — это набор сокращений, некий язык описания (подобно xml), который позволяет указать, какие тэги мы ждем, т.е. какие элементы в нашем документе должны быть, сколько раз они имеют право повторяться, какие атрибуты должны быть у элементов, какие атрибуты обязательные и необязательные, какие сущности могут использоваться.
Сущность — это некая константа. Есть ‘встроенные’ константы – <, >, & — они заменяют запрещенные в xml символы. И есть расширяемые сущности, например, ©, . Свои собственные сущности можно определить так:
<!ENTITY today "Septemer 24, 2012">
<!ENTITY company "RUSAL">
//вызов этих сущностей
<?xml version="1.0"?>
<TEXT>
Сегодня &today;
Информация о &company;
</TEXT>
Описание DTD на сегодня устарело, редко где применяется, но поскольку его еще можно встретить, знать его синтаксис лишним не будет:
<!DOCTYPE pricelist [
<!ELEMENT pricelist (book+)>
<!ELEMENT book (title,author+,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<pricelist>
<book>
<title>Название</title>
<author>Автор</author>
<price>123</price>
</book>
</pricelist>
В этом примере, мы объяснили анализатору, как должно быть, описали грамматику. Вместо #PCDATA подставляются наши данные по книгам.
Т.е. DTD — это набор правил для вашего анализатора, в котором сообщается, как выглядит ваш документ.
Но как сказать анализатору, что документ нужно проверять по нашему описанию (например, как в листинкг выше)? Есть 2 способа:
- Декларативный — см. пример листинга выше. При этом анализируемый документ называется ‘самодостаточный’ (standalone), т.е. у него есть и DTD, и сами данные. Такие документы используют очень редко, т.к. они много весят.
- Программный. Здесь нет самого DTD, есть только ссылка на него + наши данные. Но в реальности никакой файл по ссылке не загружается, это только команда браузеру переключиться в другой режим работы. Пример:
<!DOCTYPE books SYSTEM "http://phpmove.ru/books.dtd">
<book>
<title>Название</title>
<author>Автор</author>
<price>123</price>
</book>
Самое главное назначение DTD — валидация, т.е. проверка документа на соответствие стандарту. Когда документ достаточно сложный, перед преобразованием его надо бы проверить.