Учебное пособие (1075724), страница 14
Текст из файла (страница 14)
Это дает возможность использовать вдокументе XML-комментарии. Если комментарии не нужны, то инструкцияобработки <?xml . . . ?> может быть пропущена.<!ELEMENT name (#PCDATA)><!ELEMENT year (#PCDATA)><!ELEMENT howold (#PCDATA)><!ELEMENT CDATA_Example (#PCDATA)>С помощью команды !ELEMENT объявляется элемент в документе. Послекоманды !ELEMENT следует название элемента, в скобках указываетсясодержимое элемента.#PCDATA расшифровывается как «parsed character data», разбираемыесимвольные данные. Это данные, которые будут разбираться анализатором,например, они могут включать секцию <![CDATA[ ]]>.Элементы, обозначенные как #PCDATA, могут включать текст, но не могутвключать вложенные элементы.При объявлении атрибутов также используется обозначение CDATA – этоданные, которые не будут разбираться анализатором.<!ELEMENT language (name, year, howold)>В элемент language могут быть вложены элементы name, year, howold.
Онидолжны следовать именно в таком порядке, каждый элемент встречается один раз.После названия элемента, а также после выражения в скобках могутвстречаться символы «?», «+» и «*». Эти символы определяют количествовхождений элемента.«?» – элемент встречается 0 или 1 раз.«*» – элемент встречается 0 и более раз (итерация).«+» – элемент встречается 1 и более раз (позитивная итерация).117То есть используется способ описания, похожий на тот, которыйприменяется в дискретной математике для описания цепочек символов,допускаемых автоматом.Примеры:<!ELEMENT language (name?, year*, howold+)><!ELEMENT language (name, year, howold)*>Если символ стоит после скобок, то он применяется ко всему выражению вскобках.
Например<!ELEMENT language (name?, year*, howold+)+>означает, что элемент name должен встречаться 0 или 1 раз, за ним следуютэлементы year, которые встречаются 0 или более раз, затем следуют элементыhowold, которые встречаются один или более раз. Последовательность элементовname?, year*, howold+ может встречаться один или более раз, это указываетсимвол «+» после выражения в скобках.Символ « , » между элементами означает строгое следование элементов другза другом. Также может использоваться символ « | », который обозначает, чтоможет встречаться один или другой элемент, например:<!ELEMENT language ((name,year,howold)|(year,name,howold))>означает, что в элемент language могут быть вложены элементыname,year,howold или year,name,howold.<!ELEMENT language (((name,year)|(year,name)),howold)>означает, что в элемент language могут быть вложены элементы name,yearили year,name и элемент howold<!ELEMENT language (name|year|howold)*>означает, что в элемент language может быть вложен элемент name или yearили howold 0 или более раз.
Фактически это означает, что элементыname,year,howold могут быть вложены в любой последовательности любоеколичество раз.<!ATTLIST languageid CDATA #REQUIRED>118С помощью команды !ATTLIST определяются атрибуты элемента. Послекоманды !ATTLIST следует название элемента, далее перечисляются атрибуты.Для определения атрибута используется три идентификатора.Первый идентификатор – название атрибута, в нашем случае id.Второй идентификатор определяет тип данных. Чаще всего для обозначениятипа используется CDATA, то есть любые данные.Также может использоваться идентификатор ID, который определяетуникальное значение атрибута:<!ATTLIST language id ID #REQUIRED>В качестве типа могут быть перечислены возможные значения атрибута (1или 2 или 3):<!ATTLIST language id (1|2|3) #REQUIRED>Полный список типов данных приведен в спецификации.Третий идентификатор определяет обязательность использования атрибута.#REQUIRED означает обязательный атрибут, #IMPLIED означает необязательныйатрибут.#FIXED "значение" определяет, что значение атрибута фиксировано и неможет быть изменено: Например<!ATTLIST language id CDATA #FIXED "1"><!ELEMENT empty EMPTY><!ATTLIST emptyattr1 CDATA #REQUIREDattr2 CDATA #REQUIRED>Если при объявлении элемента вместо выражения в скобках используетсяEMPTY, то элемент объявляется как пустой, то есть не имеющий содержимого.
Вэтом примере элемент empty объявляется как пустой элемент с двумя атрибутами:attr1и attr2.<!ELEMENT languages (language+, empty, CDATA_Example)>119Элемент languages содержит один или более элементов language, элементempty и элемент CDATA_Example.3.1.2 Пример несоответствия документа XML и DTDВнесем изменения в элемент <language id="1"> исходного документа.Изменения выделены полужирным шрифтом.
В элемент language добавленыновый атрибут attr и новый элемент qwerty.Пример 3.2.<language id="1" attr="123"><qwerty>qwerty</qwerty><name>HTML</name><year>01.01.1990</year><howold>19</howold></language>При проверке документа на соответствие DTD возникают следующиесообщения об ошибках (в панели Task List):Рис. 3.2. Результат выполнения примера 3.2.1203.1.3 Пример встроенного DTDDTD может быть встроен в документ XML.Пример 3.3.<?xml version="1.0" encoding="Windows-1251"?><!DOCTYPE languages [<!ELEMENT name (#PCDATA)><!ELEMENT year (#PCDATA)><!ELEMENT howold (#PCDATA)><!ELEMENT CDATA_Example (#PCDATA)><!ELEMENT language (name, year, howold)><!ATTLIST languageid CDATA #REQUIRED><!ELEMENT empty EMPTY><!ATTLIST emptyattr1 CDATA #REQUIREDattr2 CDATA #REQUIRED><!ELEMENT languages (language+, empty, CDATA_Example)>]><languages><language id="1"><name>HTML</name><year>01.01.1990</year><howold>19</howold></language><language id="2"><name>XML</name><year>01.01.1998</year><howold>11</howold>121</language><language id="3"><name>SGML</name><year>01.01.1986</year><howold>23</howold></language><empty attr1="1" attr2="текст"/><CDATA_Example><![CDATA[<<<<<<<<<<>>>>>>>>>]]></CDATA_Example></languages>Результат валидации документа (пункт меню «XML/Validate»):Рис.
3.3. Результат выполнения примера 3.3.1223.1.4 Графическое представление DTDРедактор XMLPad позволяет представить внешнюю DTD в графическомвиде. Для этого необходимо открыть файл DTD и выбрать вкладку «Diagram».Для DTD и XML-схем используется одинаковая графическая нотация. Такаяже графическая нотация для DTD и XML-схем используется в редакторе XMLSPY.Пример 3.4.Рис. 3.4. Результат выполнения примера 3.4.123Если объявить элемент language следующим образом:<!ELEMENT language (name? | year+ | howold*)+>то вид диаграммы будет таким:Рис. 3.5. Результат выполнения примера 3.4.
Изменение 1.На диаграмме используются следующие обозначения:Последовательное соединение элементов, соответствует « , »Выбор элементов, соответствует « | »1243.1.5 Генерация DTD и XML-схемы по XML-документуXMLPad позволяет сгенерировать DTD или схему XML по документу XML.Для этого необходимо открыть документ XML, который не связан с DTD илиXML-схемой и выбрать пункт меню «XML/Create Schema».Рис.
3.6. Генерация DTD и XML-схемы по XML-документу.Существует возможность автоматической генерации DTD, встроенного DTDили XML-схемы.Также предусмотрена возможность привязки созданного DTD или XMLсхемыкXML-документу,приэтомвдокументXMLвставляетсясоответствующая инструкция.Необходимо отметить, что полученный DTD или XML-схема почти всегдаявляется «полуфабрикатом», который требуется дорабатывать вручную.Это происходит по двум причинам. Во-первых, программа генерации может«ошибиться» и сгенерировать не совсем точный результат. Но главная причина втом, что в одном документе, как правило, не присутствуют все возможныеварианты, которые должны быть учтены в DTD или XML-схеме.Например, программа генерации может создать перечисление некоторыхвариантов.
Но это перечисление не учитывает все возможные случаи, и егонеобходимо заменить на итерацию.1253.1.6 Преобразование DTD в XML-схему и XML-схемы в DTDВ XMLPad существует возможность преобразования DTD в XML-схему(пункт меню «DTD/Convert to XSD»).ВрежимеXML-схемытакжесуществуетвозможностьобратногопреобразования «XSD/Convert to DTD».Необходимо учитывать, что программа генерации может сгенерироватьрезультат, требующий корректировки.В обоих режимах существует возможность генерации примера документаXML, который соответствует DTD или XML-схеме. Пункт меню «DTD/Generatesample XML file» или «XSD/Generate sample XML file».3.2 ИспользованиесхемXMLдляописанияструктурыдокументов XMLXML-схемы являются альтернативой DTD.















