Проверить SGML DTD
Я написал следующий SGML DTD:
<!DOCTYPE tvguide[
<!ELEMENT tvguide--(date,channel+)>
<!ELEMENT date--(#PCDATA)>
<!ELEMENT channel--(channel_name,format?,program*)>
<!ELEMENT channel--(#PCDATA)>
<!ATTLIST channel teletext (yes|no) "no">
<!ELEMENT format--(#PCDATA)>
<!ELEMENT program--(name,start_time,(end_time|duration))>
<!ATTLIST program
min_age CDATA #REQUIRED
lang CDATA #IMPLIED es>
<!ELEMENT name--(#PCDATA)>
<!ELEMENT start_time--(#PCDATA)>
<!ELEMENT end_time--(#PCDATA)>
<!ELEMENT duration--(#PCDATA)>]>
Какой инструмент я должен использовать, чтобы проверить, есть ли какие-либо синтаксические ошибки и где, и если это действительный SGML DTD?
Какой инструмент я должен использовать для проверки файлов с использованием этого DTD? Я бы предпочел программу для Windows, но двоичный файл linux или библиотека, написанная на PHP, C, C++, Java или Javascript, тоже подойдет.
2 ответа
Посмотрите на SP от Джеймса Кларка. Я использую OmniMark для проверки SGML, но я не думаю, что вы сможете найти копии больше.
Вы должны получить ошибки о минимизации тегов (вам нужно пробелы до / после / между --
). Вы также должны получить ошибки об элементе channel
быть объявленным дважды, и ошибка об "es" в lang
объявление атрибута для program
,
Вот действительная версия для справки:
<!DOCTYPE tvguide [
<!ELEMENT tvguide - - (date,channel+)>
<!ELEMENT date - - (#PCDATA)>
<!ELEMENT channel - - (channel_name,format?,program*)>
<!ATTLIST channel teletext (yes|no) "no">
<!ELEMENT format - - (#PCDATA)>
<!ELEMENT program - - (name,start_time,(end_time|duration))>
<!ATTLIST program
min_age CDATA #REQUIRED
lang CDATA "es">
<!ELEMENT name - - (#PCDATA)>
<!ELEMENT start_time - - (#PCDATA)>
<!ELEMENT end_time - - (#PCDATA)>
<!ELEMENT duration - - (#PCDATA)>
]>
Обратите внимание, что "действительный SGML DTD" технически немного двусмысленен: это зависит от того, в какой части "декларация SGML" используется, где указываются такие вещи, как максимальная длина имени или даже то, какие символы могут встречаться в имени. Это " конкретный синтаксис ", используемый в определенном DTD (и, следовательно, в конкретном документе SGML).
Синтаксис "по умолчанию" для SGML называется " синтаксис конкретного эталона " и определен в ISO 8879:1986. Потому что в этом синтаксисе максимальная длина имен (так называемое " количество NAMELEN ") устанавливается равной 8 (восемь) и LOW LINE (_
) не может использоваться в именах (это не так называемый символ имени), ваш DTD не будет действителен по отношению к конкретному синтаксису ссылки.
HTML, например, использует свою собственную декларацию SGML: он значительно увеличивает количество NAMELEN и добавляет _
к именам персонажей, среди прочих изменений. Что касается этого конкретного синтаксиса, ваш DTD действительно будет синтаксически действительным.
Но тогда нет объявления элемента для channel_name
, но DTD требует, чтобы по крайней мере один такой элемент присутствовал в tvguide
(а именно, содержится в обязательном элементе channel
). [Оставление объявления для типа элемента, который не встречается в документе, само по себе не является ошибкой или проблемой.]
Таким образом, DTD (пока) не является "действительным" в том смысле, что вы не можете писать какие-либо элементы документа (т.е. tvguide
элементы, или просто "документы"), которые действительны в соответствии с ним.
Добавление простой декларации для channel_name
лайк
<!ELEMENT channel_name (#PCDATA)>
исправляет это - теперь, например, элемент документа
<tvguide>
<date>2016</date>
<channel><channel_name>XTV</channel_name></channel>
</tvguide>
действует в соответствии с вашим DTD. (Я попробовал это с помощью анализатора SP, упомянутого в другом ответе.)
Упрощение имен в вашем DTD сделало бы все это действительным " Базовым документом SGML " и даже действительным " Минимальным документом SGML " - эти термины (снова из ISO 8879) ближе всего подходят к понятию "действительный SGML", когда нет конкретного дан контекст и объявление SGML: они в основном означают "переносимый и приемлемый для любой системы SGML". Вот мой предложенный вариант:
<!DOCTYPE tvguide [
<!ELEMENT tvguide - - (date,channel+)>
<!ELEMENT date - - (#PCDATA)>
<!ELEMENT channel - - (ch-name,format?,program*)>
<!ATTLIST channel
teletext (yes|no) no>
<!ELEMENT format - - (#PCDATA)>
<!ELEMENT ch-name - - (#PCDATA)>
<!ELEMENT program - - (name,start-tm,(end-tm|duration))>
<!ATTLIST program
min-age CDATA #REQUIRED
lang CDATA "es">
<!ELEMENT name - - (#PCDATA)>
<!ELEMENT start-tm - - (#PCDATA)>
<!ELEMENT end-tm - - (#PCDATA)>
<!ELEMENT duration - - (#PCDATA)>
]>
<tvguide>
<date>2016-12-11</date>
<channel><ch-name>X-TV 4</ch-name></channel>
</tvguide>