понедельник, 13 ноября 2017 г.

Необходимость написать грамматику. DTD. XML

Мы почти никогда не будем с ним работать.
Смысл ДТД - прост. Это просто набор правил. Правил для кого? Для анализатора, объсняющих ему, в каком виде выглядит ваш документ.
Например, у нас есть документ:



У нас есть прайслист с элементом бук. Мне надо описать грамматику. В ДТД - это декларативная тема. Это набор инструкций, деклараций, правил, каждая начинается с восклицания "Пусть будет элемент букс!" Я объявляю элемент такой-то. В скобочках указываем их наполнение.

Пусть будет элемент прайслист, у него будет элемент букс, в котором будет тайтл, автор, прайс. Пусть будет элемент тайтл, а там #PCDATA (т.е. текст).


В ДТД много элементов, но нам ща нужны три:



ELEMENT - описывает тег, элемент.
ATTLIST - спиоск атрибутов (attribute list)
ENTITY - определяет сущность.

+, ? - модификаторы - они объясняют повторения этих элементов.

Скрин с примером ДТД:
У меня есть прайслист, в нем одна или более книг.  Если я хочу ноль или более - звездочка.
Элемент книга: в нем есть 1 тайтл по умолчанию, ноль или более авторов, одна цена и возможно есть, возможно нет, описание.
и т.д.

 А как сказать анализатору о том, что документ нужно проверять по этому описанию.
Есть 2 способа:
декларативно - в самом доке в XML ему указывается прямо в прологе  - восклицание
<!DOCTYPE - декларация, объяснение, объяснение нашей структуры.
А как для всего документа структуру описать, это же описание тега.
Что такое документ? Это корневой тег. Т.е. достаточно прописать структуру корневого тега - и мы описали весь документ.


В этом скирне первый блок - это все декларация. Т.е. декларирую прайслист. И дальше в квадратных скобочках указываю что может быть в прайслисте. Начинаю описывать ДТД самого прайслиста, доктайп, декларацию.
Т.о. мы анализатору объясняем что у нас должно быть в доке. Такой документ называется  самодостаточным - standalone.
В старых есть еще вверху такое: standalone="yes" - это кагбэ объясняет анализатору, что это самодостаточный документ, у него есть и ДТД, и сами данные.
Самодостаточными бывают редко, почти никогда, ибо много занимает 100-200 килобайт описания. Документ получается огромный, поэтому и юзают редко.
В html то же самое.
Т.о. у нас есть два способа указать документу ДТД:
1. Доктайп, имя корневого элемента, квадратные скобочки, а в них перечисление описания.
2. Мой-то стандарт никто не знает, поэтому паблик не юзаем никогда? - если парсер сам знает.
Пишем system, а затем указание на файл или урл.
Т.е. имеется books, описывается в файле books.dtd. Там может быть урл.
Вот два файлика, с описанием и сама books.dtd.




Возникает вопрос, ок, а как теперь он будет проверять?
В хтмл браузеры, когда открываем эти вещи, ничего не загружают. Это просто декларация, которую используют для того, чтобы переключить браузер в другой режим. Реально никакой файл не загружается.
Просто разработчики сделали так: если есть декларация - 1 режим, если нет декларации - другой режим работы браузера. Реально браузер ничего не загружает.

Когда открываем в эксплорере, на самом деле отрабатывает не эксплорер, а парсер msxml, входящий в состав ОС винда. У эсплорера xmlного парсера нет, он юзает стандартный виндовый парсер.
Здесь все зависит от самого парсера, от конкретного производителя.



Чаще всего так: стандартно парсеры при загрузке документа ничего не проверяют, чтобы сделать это как можно быстрее. Если речь идет о майкрософтовском парсере, у него есть специальное свойство, которое можно включить программно - валидэйтн парс. То же самое в пхп. Т.е. если оно программно включено до загрузки документа, то в этом случае он попытается проверить прямо на загрузке документа, но по умолчанию оно выключено.
У любого парсера есть специальная команда - проверяй. И вот тогда он уже пытается сделать соответствие между грамматикой и реальным документом. Браузер - это же не штука для работы c XML.
Это можно посмотреть в XML Tools. У браузера нет задачи проверки наших документов.
XML Tools - это инструмент для работы с XML. В т.ч. сюда входит свой парсер и у него есть команда 'validate now'.

DTD позволяет определить:
1. Какие теги допустимы.
2. Их повторение.
3. Их атрибуты.
4. Сущности.
ДТД - это грамматика.


















Атрибуты объявляются с помощью специального декларативного описания attlist - attribute list, т.е. список атрибутов. Он может объявить сразу несколько атрибутов.
Т.е. сначала название.
price - название элемента, для которого определяем атрибут.
currenty - атрибут.
CDATA - тип.
#REQUIRED - обязателен/необязателен.
хм... implied - необязателен, че-та не помню, шоб встречала это слово, забавно) А еще думаю, шо английский как-то знаю) Видимо, родственное implification, но там вроде совсем другой смысл.
В ДТД, когда мы объявляем содержимое элемента, мы всегда пишем PCDATA - парсируемые символьные данные. Т.е. анализатор обязан разбирать то, что находится внутри этих данных на наличие других элементов или сущностей. В других языках возможно - XJML - там допускались и другие элементы.
В атрибуте - CDATA, т.е. анализатор не должен разбирать то, что написано внутри атрибута.
Объявление ENTITY.





























Комментариев нет:

Отправить комментарий