Часть 2 (1075658), страница 2
Текст из файла (страница 2)
Например<!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 и элемент howold8<!ELEMENT language (name|year|howold)*>означает, что в элемент language может быть вложен элемент name или yearили howold 0 или более раз.
Фактически это означает, что элементыname,year,howold могут быть вложены в любой последовательности любоеколичество раз.<!ATTLIST languageid CDATA #REQUIRED>С помощью команды !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>9Если при объявлении элемента вместо выражения в скобках используетсяEMPTY, то элемент объявляется как пустой, то есть не имеющий содержимого.
Вэтом примере элемент empty объявляется как пустой элемент с двумя атрибутами:attr1и attr2.<!ELEMENT languages (language+, empty, CDATA_Example)>Элемент languages содержит один или более элементов language, элементempty и элемент CDATA_Example.3.1.2 Пример несоответствия документа XML и DTDВнесем изменения в элемент <language id="1"> исходного документа.Изменения выделены полужирным шрифтом. В элемент language добавленыновый атрибут attr и новый элемент qwerty.Пример 2.<language id="1" attr="123"><qwerty>qwerty</qwerty><name>HTML</name><year>01.01.1990</year><howold>19</howold></language>При проверке документа на соответствие DTD возникают следующиесообщения об ошибках (в панели Task List):10Рис. 2.
Результат выполнения примера 2.3.1.3 Пример встроенного DTDDTD может быть встроен в документ XML.Пример 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>11<!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></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»):12Рис.
3. Результат выполнения примера 3.3.1.4 Графическое представление DTDРедактор XMLPad позволяет представить внешнюю DTD в графическомвиде. Для этого необходимо открыть файл DTD и выбрать вкладку «Diagram».Для DTD и XML-схем используется одинаковая графическая нотация. Такаяже графическая нотация для DTD и XML-схем используется в редакторе XMLSPY.Пример 4.13Рис. 4.
Результат выполнения примера 4.Если объявить элемент language следующим образом:<!ELEMENT language (name? | year+ | howold*)+>то вид диаграммы будет таким:Пример 5.14Рис. 5. Результат выполнения примера 4. Изменение 1.На диаграмме используются следующие обозначения:Последовательное соединение элементов, соответствует « , »Выбор элементов, соответствует « | »153.1.5 Генерация DTD и XML-схемы по XML-документуXMLPad позволяет сгенерировать DTD или схему XML по документу XML.Для этого необходимо открыть документ XML, который не связан с DTD илиXML-схемой и выбрать пункт меню «XML/Create Schema».Рис.
6. Генерация DTD и XML-схемы по XML-документу.Существует возможность автоматической генерации DTD, встроенного DTDили XML-схемы.Также предусмотрена возможность привязки созданного DTD или XMLсхемыкXML-документу,приэтомвдокументXMLвставляетсясоответствующая инструкция.Необходимо отметить, что полученный DTD или XML-схема почти всегдаявляется «полуфабрикатом», который требуется дорабатывать вручную.Это происходит по двум причинам.
Во-первых, программа генерации может«ошибиться» и сгенерировать не совсем точный результат. Но главная причина втом, что в одном документе, как правило, не присутствуют все возможныеварианты, которые должны быть учтены в DTD или XML-схеме.Например, программа генерации может создать перечисление некоторыхвариантов.
Но это перечисление не учитывает все возможные случаи, и егонеобходимо заменить на итерацию.3.1.6 Преобразование DTD в XML-схему и XML-схемы в DTDВ XMLPad существует возможность преобразования DTD в XML-схему(пункт меню «DTD/Convert to XSD»).16ВрежимеXML-схемытакжесуществуетвозможностьобратногопреобразования «XSD/Convert to DTD».Необходимо учитывать, что программа генерации может сгенерироватьрезультат, требующий корректировки.В обоих режимах существует возможность генерации примера документаXML, который соответствует DTD или XML-схеме.
Пункт меню «DTD/Generatesample XML file» или «XSD/Generate sample XML file».3.2 ИспользованиесхемXMLдляописанияструктурыдокументов XMLXML-схемы являются альтернативой DTD. Они, также как и DTD,определяют набор используемых элементов, идентифицируют элементы, которыемогут использоваться внутри других элементов, определяют возможные атрибутыдля каждого элемента. По сравнению с DTD, схемы обеспечивают болеепонятный способ описания документов.
Схемы XML, в отличие от DTD, являютсяXML – документами.Как отмечалось ранее, в DTD для описания содержимого элементаиспользуется способ, похожий на описание цепочек символов, допускаемыхавтоматом. В схемах XML используется способ, более привычный дляпрограммиста: определяются типы данных и указывается принадлежностьэлементов XML к этому типу данных.3.2.1 Пример XML-схемыПример 6.Файл XML:<?xml version="1.0" encoding="Windows-1251"?><languages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="Example_schema.xsd"><language id="1"><name>HTML</name><year>01.01.1990</year>17<howold>19</howold></language><language id="2"><name>XML</name><year>01.01.1998</year><howold>11</howold></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>Файл XSD:<?xml version="1.0" encoding="utf-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><xsd:complexType name="languageType"><xsd:sequence><xsd:element name="name" type="xsd:string"/><xsd:element name="year" type="xsd:string"/><xsd:element name="howold" type="xsd:integer"/></xsd:sequence><xsd:attribute name="id" use="required" type="xsd:string"/></xsd:complexType><xsd:complexType name="emptyType"><xsd:attribute name="attr1" type="xsd:string" use="required"/><xsd:attribute name="attr2" type="xsd:string" use="required"/></xsd:complexType>18<xsd:element name="languages"><xsd:complexType><xsd:sequence><xsd:element name="language" type="languageType"maxOccurs="unbounded"/><xsd:element name="empty" type="emptyType"/><xsd:element name="CDATA_Example"type="xsd:string"/></xsd:sequence></xsd:complexType></xsd:element></xsd:schema>Проверить соответствие XML-документа схеме, как и в случае DTD, можно сиспользованием пункта меню «XML/Validate».Если документ действителен («валиден»), то есть соответствует схеме, товыдается сообщение об отсутствии ошибок.