Парсер XML


Парсер 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 — валидация, т.е. проверка документа на соответствие стандарту. Когда документ достаточно сложный, перед преобразованием его надо бы проверить.


Ваш комментарий

Ваш адрес email не будет опубликован.

Для отправки комментария, поставьте отметку, что разрешаете сбор и обработку ваших персональных данных . Политика конфиденциальности