Введение в XML DTD. Основы использования XML-схем для определения элементов

Шпаргалка по DTD .

DTD – Один из способов формализованного описания схемы документа XML , сделанного на языке, понятном программе-анализатору.

В настоящее время идет отказ от использования DTD в пользу XSD (XML Schema Definition ), по ряду причин:

  • DTD использует отличный от XML синтаксис.
  • Отсутствует типизация узлов.
  • Отсутствует поддержка пространств имён.

Тем не менее этот способ ещё широко применяется поскольку является более простым и удобным для описания несложных схем документов.

КОНСТРУКЦИИ DTD

Описание схемы состоит из объявлений разметки (markup declaration ), начинающихся с пары символов “ ” далее идет одно из слов:

  • ELEMENT (указывает, что объявляется элемент )
  • ATTLIST (список атрибутов )
  • ENTITY (сущность )
  • NOTATION (обозначение )

объявление разметки заканчивается “>

ОБЪЯВЛЕНИЕ ТИПА ЭЛЕМЕНТА

(должен быть описан каждый элемент документа)

Содержимое:

  • EMPTY – пустой (например
    )
  • ANY – любое содержимое (встречается редко)
  • (#PCDATA) – только символьные данные
  • (список имен вложенных элементов ч.з. запятую) – вложенные элементы должны следовать в документе в том порядке, в котором они перечислены в объявлении. Объявляется только один уровень вложенности. Элементы можно группировать скобками.
    Использование разделителя | между элементами указывает, что встречается один из разделенных элементов.
    После элементов или скобок:
    • ? – встречается 0 или 1 раз
    • * – 0 или несколько раз
    • + – 1 или несколько раз

ОБЪЯВЛЕНИЕ АТРИБУТОВ

Атрибуты объявляются после объявления самого элемента. Все атрибуты одного элемента объявляются сразу, одним списком.

Для каждого атрибута записывается его имя, тип и признак обязательности.

Типы атрибутов:
  • CDATA – (Character set of data ) строка символов
  • Список значений атрибута в скобках, перечисл чз “|”
  • ID – уникальный идентификатор
  • IDREF – идентификатор, содержащий одно из значений атрибута ID , исп в качестве ссылки на др элементы
  • IDREFS – идентификатор, содержащий набор значений атрибута типа ID , перечисленных через пробел, так же исп в качестве ссылки сразу на несколько элементов.
  • ENTITY – имя не проверяемой анализатором сущности (объявленные в том же описании DTD )
  • ENTITIES – имена не проверяемых анализатором сущностей.
  • NMTOKEN – слово, содержащее только символы, применяемые в именах (имена др элементов или атрибутов, например чтобы ссылаться на них )
  • NMTOKENS – слова, перечисленные через пробелы
  • NOTATION – обозначение (обозначения, расшифрованные в описании DTD )
  • NOTATIONS – список нотаций
признак обязательности:
  • Значение атрибута по умолчанию – указывается в кавычках и обозначает что атрибут необязателен.
  • # REQUIRED – атрибут надо обязательно записывать в элементе.
  • # IMPLIED – атрибут необязателен, у него нет значения по умолчанию.
  • # FIXED – у атрибута есть только одно значение, кот записывается тут же через пробел.

При исп пространства имен надо всегда указывать уточненное (QName ), а не локальное имя.

Атрибуты не входят в пространство имен по умолчанию.

Атрибуты “xml:lang ” и “xml:space ” так же дол быть объявлены в DTD в случае их применения

ОБЪЯВЛЕНИЕ СУЩНОСТЕЙ

(начинаются с “&”, а заканчиваются “;”)

Внутренние сущности – задаются при объявлении сущности.

— можно применять дальше в самом DTD ниже объявления.

Внешние сущности – содержатся в отдельном файле или встроены в программу-анализатор.

Параметризованные сущности – исп только внутри описания DTD

Сущности делятся на разбираемые(parsed ) и не разбираемые (unparsed ). Разбираемые предст собой фрагмент документа XML или целый документ и подлежат обработке программой-анализатором после подстановки. После подстановки разборки сущность становится частью XML документа.

Двоичный программный код, чертеж, изображение и др. не надо обрабатывать средствами XML , для этого сущность надо объявить не разбираемой. Для этого в конце объявления сущности делается пометка “NDATA ” и указывается обозначение (notation ) вставляемого объекта.

ПРЕДОПРЕДЕЛЕННЫЕ СУЩНОСТИ В XML

ОБЪЯВЛЕНИЕ ОБОЗНАЧЕНИЯ ( NOTATION)

Объявляются подобно сущностям, также могут быть внутренними и внешними.

Внутренняя

Внешняя

SYSTEM | PUBLIC — в данном случае равнозначны т.к. в public не обязательно общеизвестная ссылка.

РАЗМЕЩЕНИЕ DTD

Либо в отдельном файле “*.dtd ” указав его имя в кавычках во второй части пролога DOCTYPE , либо включить описание непосредственно во вторую часть пролога, заключив его в квадратные скобки.

]> бла

Как раз таковыми и являются. Причём XML сам по себе предусматривает расширяемость. Документы созданные с помощью этих языков могут быть «корректными (well-formed)» и «допустимыми (valid)».

С проверкой документа на корректность проблем не возникает: если ошибок не выскочило и всё отобразилось так, как мы хотели, то документ корректен. Например, если в HTML-документе написать что-то вроде « Привет! », то наш документ будет полностью корректен, но проигнорирован браузером. Почему? Потому что браузер ничего не знает о том, что это за «Z» такой. И если мы проверим наш документ на допустимость с помощью валидатора , то документ таковым признан не будет. А как об этом узнает валидатор и на основании чего он вынес такой вердикт?

Допустимость проверяется с помощью определения типа документа (DTD, document type definition). Например, для «строгого» HTML он выглядит так .

DTD может быть описан как внутри документа, так и вынесен в отдельный файл (аналогия с CSS: встроенные и подключаемые таблицы стилей).

Объявление DTD

Объявление DTD располагается перед первым (корневым) элементом документа, начинается с последовательности « ».

Внутреннее DTD описывается так:

Между квадратными скобками располагается содержимое DTD, так называемое внутреннее подмножество , например:

] >

Если DTD вынесено в отдельный файл (обычно имеющий расширение.dtd), то его объявление в документе записывается так:

Соответственно, в этом файле и прописываются все правила, так называемое внешнее подмножество .

Имя, указанное за словом « DOCTYPE » (в нашем случае « catalog »), должно соответствовать имени корневого элемента. То есть, XML-документ должен быть примерно таким:

Hello, world!

Вместо ключевого слова « SYSTEM » может быть использовано слово « PUBLIC », указывающее, что DTD применяется для широкого использования:

Внутренние и внешние подмножества могут быть заданы одновременно (опять же, аналогия с CSS):

] >

Здесь, сначала зачитывается содержимое файла « catalog.dtd », а потом содержимое, указанное внутри квадратных скобок.

Элементы документа

Элементы объявляются в DTD с помощью ключевого слова « ELEMENT », после которого следует имя элемента и его содержимое заключенное в круглые скобки:

Если у элемента есть дочерние элементы, то это записывается так:

что соответствует документу:

</book> </p><p>Если у элемента несколько дочерних элементов, то они перечисляются через запятую и должны следовать строго в указанном порядке:</p><p> <!ELEMENT book (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> </p><p>Приведённый выше пример читается следующим образом. Элемент « book » должен содержать только один элемент « title », за которым должен следовать только один элемент « author ». Сами элементы « title » и « author » никаких элементов не содержат, а могут содержать лишь какой-нибудь текст.</p> <p>С помощью следующих специальных символов можно определять количественное присутствие элемента:</p> <ul><li>Символ « * », следующий после элемента, означает, что элемент может присутствовать один или несколько раз, или не присутствовать вовсе(от нуля до + бесконечности)</li> <li>Символ « + », следующий после элемента, означает, что элемент может присутствовать один или несколько раз(от 1 до + бесконечности)</li> <li>Символ « ? », следующий после элемента, означает, что элемент может либо отсуствовать, либо присутствовать только один раз(0 или 1)</li> </ul> <!ELEMENT book (title, author)> ... <!ELEMENT book (title*, author)> ... <!ELEMENT book (title+, author)> ... <!ELEMENT book (title?, author)> <p>Если существует необходимость указать один из нескольких элементов (или title, или author — любой из них, но не оба), надо испольовать символ « | »:</p><p> <!ELEMENT book (title | author)> </p><p>Текст тоже равноправный участник игры. Ключевое слово « PCDATA » указывает на анализируемые символьные данные, поэтому любой текст содержащий символы разметки (« < », « > » и « & ») будет трактоваться как разметка. Совместное использование текста и элементов называется <i>смешанным содержимым </i>. При объявлении смешанного содержимого, « PCDATA » необходимо указывать первым:</p><p> <!ELEMENT book (#PCDATA | title | author)> </p><p>Следующий фрагмент документа валиден вышеприведенному примеру:</p><p> <book> <title /> </book> <book> <author /> </book> <book> Нет данных </book> </p><p>Группы элементов заключаются в круглые скобки. Элемент « book » должен содержать либо текст, либо (один « title », один или неколько « author » и может быть один « pubyear » именно в таком порядке):</p><p> <!ELEMENT book (#PCDATA | (title, author+, pubyear?))> <!ELEMENT disc (#PCDATA | title)*> </p><p>Данному примеру соответствует следующий фрагмент XML-документа:</p><p> <disc /> <book> <title /> <author /> <author /> </book> <book> Нет данных </book> </p><p>Элемент может быть пустым. Такой элемент не может содержать не дочерних элементов ни текста (например, элемент « br » в HTML). Такой элемент задается с ключевым словом « EMPTY »:</p><p> <!ELEMENT photo EMPTY> </p><p>Элемент также может быть объявлен с ключевым словом « ANY » означающее, что элемент может содержать и элементы, и текст, и все это вместе, и даже быть пустым.</p> <h3>Атрибуты элементов</h3> <p>Элементы в XML-документе могут иметь атрибуты, которые записываются в виде « имя = значение » в открывающем или пустом тегах. Общее объявление атрибутов конкретного элемента начинается с ключевого слова « ATTLIST », после которого следует имя данного элемента и объявления самих атрибутов:</p><p> <!ELEMENT title (#PCDATA)> <!ATTLIST title id CDATA #REQUIRED stock CDATA #IMPLIED> </p><p>Ключевое слово « REQUIRED » указывает на то, что атрибут обязателен. Ключевое слово « IMPLIED », наоборот, говорит, что атрибут необязателен.</p> <p>У атрибутов могут быть перечисленны разрешенные значения:</p><p> <!ATTLIST title readonly (yes|no) #REQUIRED> </p><p>Также может быть задано значение по-умолчанию:</p><p> <!ATTLIST title readonly (yes|no) #REQUIRED "yes"> pubyear CDATA #IMPLIED "2007"> </p><p>Атрибут может быть и константой, то есть у него может быть только то значение, которое заявлено в объявлении атрибута. Делается это с помощью ключевого слова « FIXED »:</p><p> <!ATTLIST title copyright <strong>#FIXED "udvikler"> </p><p>Тип атрибута « CDATA »позволяет использовать любые символы кроме « < », « > », « & », « " » и « " ». В случае использования, данные символы должны быть заменены на спецсимволы типа « < » и т.п. Внимание : в DTD ключевое слово « CDATA » имеет другое значение, чем раздел « CDATA » в XML-документе!</p> <p>Помимо типа CDATA, атрибуты могут иметь следующие типы:</p> <ul><li>NMTOKEN - может содержать только буквы, цифры, « . », « - », « _ » и « : »</li> <li>NMTOKENS - может содержать те же символы, что и « NMTOKEN », а также символы пробела, возврата каретки, перевода строки и табуляции</li> </ul> <!ATTLIST title id CDATA #REQUIRED stock NMTOKEN #IMPLIED publisher NMTOKENS #IMPLIED> <p>Еще один тип атрибута « ID » разрешает задавать те же значения, что и тип NMTOKEN, но начинаться значение должно либо с буквы, либо с « _ », либо с « : ». У любого элемента может быть только один атрибут с типом « ID ». Атрибут типа « ID » не может быть константой (объявляться как « FIXED »). Значение атрибута типа « ID » должно быть уникальным для всего XML-документа:</p><p> <!ELEMENT book (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ATTLIST title id ID #REQUIRED stock CDATA #IMPLIED> <!ATTLIST author id ID #REQUIRED city CDATA #IMPLIED> </p><p>Атрибут элемента может быть ссылкой на атрибут типа « ID » другого элемента. Для этого он объявляется как атрибут типа « IDREF ». Если атрибут должен ссылаться на атрибут типа « ID » нескольких элементов, то испольуется ключевое слово « IDREFS »:</p><p> <!ELEMENT book (title+, author, year, publisher)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT year (#PCDATA)> <!ELEMENT publisher (#PCDATA)> <!ATTLIST title id ID #REQUIRED> <!ATTLIST author id ID #REQUIRED> <!ATTLIST year ref IDREF #REQUIRED> <!ATTLIST publisher from IDREFS #REQUIRED> </p><p>В XML-документе это будет выглядить так:</p><p> <book> <title id="t1" /> <title id="t2" /> <title id="t3" /> <author id="a1" /> <year ref="t2" /> <publisher from="t1 t2 a1" /> </book> </p><h3>Объявление сущностей</h3> <p>Помимо элементов и их атрибутов, мы можем определить <i>сущности </i>, записываемые с помощью ключевого слова « ENTITY »:</p><p> <!ENTITY name "SuperMegaMaster"> </p><p> <userName>&name;</userName> </p><p>В результате чего, на место имени сущности « name », будет подставлено ее значение, в нашем случае — « SuperMegaMaster ».</p> <p>И для полноты нашего счастья, надо добавить, что атрибуты элементов могут иметь в качестве значения подобные сущности — <i>сущности-атрибуты </i>. Они тоже определяются с помощью ключевого слова « ENTITY », но имеют одно ограничение — они должны ссылаться на внешние неанализируемые сущности, определенные во внешнем подмножестве DTD:</p><p> <!DOCTYPE catalog [ <!ENTITY list SYSTEM "companyList.html" NDATA parse> <!ELEMENT catalog (user+)> <!ELEMENT user (name)> <!ATTLIST user company ENTITY #REQUIRED> <!ELEMENT name (#PCDATA)> ] > </p><p>В вышеприведённом примере, объявлена сущность « list », которая ссылается на внешний документ « companyList.html ». Ключевое слово « NDATA », говорит о том, что внешний документ неявляется XML-документом. Далее, для элемента « user » объявляется атрибут « company », который является обязательным и имеет тип « ENTITY », то есть ссылается на какую-либо сущность. Поскольку в нашем пример задана только одна сущность (« list »), то именно она и только она может быть значением атрибута « company » в XML-документе:</p><p> <catalog> <user company="list"> <name>SuperMegaMaster</name> </user> </catalog> </p><p>Осталось только понять, что означает « parse » в строке объявления сущности « list »? Когда используются неанализируемые данные, то есть те, которые не анализируются синтаксическим анализатором XML, хорошо было бы дать информацию приложению (использующему данный XML-документ), каким образом обработать эту сущность, если все-таки потребуется. Для этого нужно использовать нотацию, задаваемую ключевым словом « NOTATION » и дополнить наш DTD следующим образом:</p><p> <!NOTATION parse SYSTEM "iexlorer"> <!ENTITY list SYSTEM "companyList.html" NDATA parse> </p><p>Слово « parse » в объявлении сущности лист указывает на то, каким образом можно проанализировать файл « companyList.html » — найти нотацию с именем « parse » и следовать ее указаниям. В нашем случае, приложение может открыть MS InternetExplorer и загрузить в него документ « companyList.html ».</p> <p>Аннотация: <span>В данном разделе описываются общие принципы написания Определение типа документа. Так же рассмотрены основные недостатки и особенности DTD. </p><h3>Зачем нужно DTD.</h3><p>Создавая XML документ разработчик сам решает: как назвать теги, в каком порядке они будут следовать, какие данные будут записаны в том или ином элементе, будут ли у элемента атрибуты или нет и многое другое. Без формального описания структуры документа этим самым документом может воспользоваться только его разработчик. В случае если разработанный XML документ предназначен для передачи во внешний мир, например партнерам по бизнесу, и если к тому же планируется получать в ответ документы, написанные в том же самом формате без определения типов документов ( Document Type Definition , DTD ) не обойтись. Это связано с тем, что для того, что бы обе стороны могли понимать полученную информацию элементы и атрибуты в документах должны употребляться всеми сторонами одинаково. Определения типа документа вносят строгость и точность в правила написания правильно оформленных документов XML . Хранимые в начале файла XML или внешним образом в виде файла *.DTD , определения типов документов описывают информационную структуру документа. В DTD перечисляются возможные имена элементов, определяются имеющиеся атрибуты для каждого типа элементов и описывается вложенность элементов.</p><p>XML используется в качестве средства для описания грамматики других языков. И таким образом разрабатывая некоторый язык для написания XML документов в той или иной области нам придется разработать словарь данной области деятельности. DTD по определению содержат всю информацию которая может появиться в XML документе. Все, что входит в проект, должно быть включено в DTD . Таким образом DTD описания в сущности и является таким словарем. Современный мир меняется достаточно динамично поэтому заранее не известно какая информация может потребоваться в дальнейшем и для того что бы не пришлось часто изменять структуру документов обычно разрабатываемый словарь включает в себя все что может понадобиться для конкретных видов бизнеса или промышленности. Это позволяет использовать определения DTD как средство анализа и проектирования. Приложения XML взаимодействуют друг с другом на основе словарей, которые они понимают, так что определение DTD помогает понять, что может описать приложение .</p><p>Другое применение DTD это проверка написанного XML документа на корректность . Правильно оформленные документы, написанные в соответствии со всеми правилами, описанными в спецификации XML , не могут быть проверены на предмет ошибок. Пропущенные ошибки могут вызвать повреждение программы обрабатывающей данные документы, либо ввод в систему неверных данных. Но если документ ссылается на определение DTD , то, используя проверяющий на допустимость анализатор можно проверить, есть ли в нашем документе ошибки. Анализатор затребует DTD и убедится, что документ соответствует описанным в нем грамматическим правилам. Анализатор обнаруживает структурные ошибки и ошибки содержания, что намного уменьшает объем проверок, выполняемых логикой приложения.</p> <h3>Написание определений DTD: общие принципы.</h3> <h4>Ассоциирование DTD с документом XML</h4><p>Для связывания декларации DTD с экземпляром документа в версии XML 1.0 предлагается специальная декларация DOCTYPE . Она должна следовать после декларации XML и предшествовать любым элементам документа. Тем не менее, между декларациями XML и DOCTYPE могут находиться комментарии и команды обработки.</p><p>Декларация DOCTYPE содержит ключевое слово DOCTYPE , за которым следует имя корневого элемента документа, а затем конструкция с декларациями содержания. Перед разъяснением этого утверждения рассмотрим пример расположения декларации DOCTYPE в экземпляре документа. Ниже приводятся первые три строчки документа XML:</p><p>.. <xml version ="1.0" ?> <!DOCTYPE root_element_name … > <root_element_name > …</p><p>Можно написать внешнее подмножество деклараций в отдельном файле DTD , включить внутреннее подмножество в тело декларации DOCTYPE или сделать то и другое. В последнем случае (смешение внутренних и внешних DTD ) во внутренних DTD могут быть заданы новые декларации или переписаны те, что содержатся во внешних (по определению спецификации XML анализаторы сначала читают внутреннее подмножество, и потому содержащиеся там декларации пользуются приоритетом).</p><p>Декларации XML могут содержать атрибут standalone, принимающий только значения "yes" и "nо". Если значение атрибута равно yes, то внешние для экземпляра документа декларации не влияют на информацию, передаваемую документом использующему его приложению. Значение no показывает, что существуют внешние декларации со значениями, необходимыми для правильного описания содержания документа - например конкретные значения по умолчанию. На практике необязательный атрибут standalone используется редко. Наличие этого атрибута со значением, yes не гарантирует отсутствия внешних зависимостей любого типа. Просто внешние зависимости в этом случае не приведут к ошибке в документе, если не будут включены в обработку. Таким образом, в основном этот атрибут представляет собой знак для анализаторов и других приложений, показывающий, нужно ли им использовать какое-либо внешнее содержание.</p><p>Блок внутренней декларации разметки тега DOCTYPE состоит из левой квадратной скобки, списка деклараций и правой квадратной скобки:</p><p>Внутренние DTD очень полезны, они всегда содержатся в использующем их документе и поэтому их получение анализатором не представляет проблем. Однако внутренние DTD значительно увеличивают размер документа. На практике внутренние DTD чаще всего применяются одновременно с внешними для добавления новых декларации. Если там объявлен какой-либо объект, продекларированный также и во внешнем определении DTD , приоритетом пользуется внутреннее. Это позволяет осуществлять тонкую настройку деклараций для нужд конкретных документов.</p><p>Внешние DTD в некоторых отношениях более гибкие. В данном случае декларация DOCTYPE состоит из обычного ключевого слова и имени корневого элемента, за которым следует еще одно ключевое слово SYSTEM либо PUBLIC , обозначающее источник внешнего определения DTD , а за ним - локализация этого определения. Если ключевое слово SYSTEM , DTD обязано непосредственно и явным образом находится по указанному URL адресу.</p><p>Если внешние DTD переписываются очень часто, они начинают терять свое значение, а это признак плохого первоначального проекта.</p><p>Ключевое слова PUBLIC предназначено для хорошо известных словарей. Приложение, анализирующее документ из этого словаря, должно использовать некоторую стратегию по поиску соответствующего DTD .</p><p>Стандарт XML 1.0 допускает у декларации PUBLIC наличие как публичного URI , так и системного идентификатора. Если работающее с документом приложение или анализатор не могут найти DTD по идентификатору URI с ключевым словом PUBLIC , оно должно использовать системный идентификатор.</p> <h4>Основные декларации разметки</h4><p>Допустимое в документе XML содержание определяется с помощью четырех типов декларации разметки в DTD . В следующей далее таблице показаны связанные с этими декларациями ключевые слова и их значения:</p><p>Первые два типа связаны с информацией, которую мы рассчитываем найти в документе XML, - элементами и атрибутами.</p><p>Последние два типа используются для поддержки. Особенно облегчают жизнь разработчика словаря XML сущности. Как правило, они состоят из содержания, которое настолько часто используется в DTD или документе, что оправдывает создание специальной декларации. Применение этой декларации напоминает оператор include в языках C/C++ , когда в качестве замены для содержания используется имя.</p><p>Нотации описывают содержание, разработанное не на языке XML. Используются они для того, чтобы объявить конкретный класс данных и связать его с внешней программой. Эта внешняя программа становится обработчиком объявленного класса данных. Например, связав с документом изображение в формате JPEG, разработчик желает, чтобы программа приняла и визуализировала двоичные данные в этом формате. Конечно, в таком случае документ зависит от того, какой обработчик имеется в системе, получающей документ. В интересах портативности и переносимости некоторые авторы не приводят ссылки на обработчики. В таком случае нотация превращается просто в механизм набора текста.</p> <p>Используйте для определения структуры XML-документов XML-схемы вместо DTD</p> <p>XML-схема обладает более мощными возможностями, чем DTD. Для иллюстрации преимуществ использования механизма XML-схем в первых трех листингах сравниваются различные способы представления элементов. В представлена выдержка из XML-документа. В показаны два элемента, объявленные в синтаксисе DTD, а в представлен синтаксис, соответствующий XML-схеме. Обратите внимание, что синтаксис в Листинге 3 подобен синтаксису XML. При использовании схемы, валидирующий парсер может выполнить проверку, является ли элемент InvoiceNo положительным целым числом, и состоит ли ProductID из заданного набора символов (шести цифр и одной буквы от A до Z). Парсер, обрабатывающий DTD-определение, может лишь подтвердить, что данные элементы представляют собой строки.</p><h5>Листинг 1: Фрагмент XML-документа</h5><span> <InvoiceNo>123456789</InvoiceNo> <ProductID>J123456</ProductID> </span><h5>Листинг 2: Фрагмент DTD, описывающий элементы из Листинга 1</h5><span> <!ELEMENT InvoiceNo (#PCDATA)> <!ELEMENT ProductID (#PCDATA)> </span><h5>Листинг 3: Фрагмент XML-схемы, описывающий элементы из Листинга 1</h5><span> <element name="InvoiceNo" type="positive-integer"/> <element name="ProductID" type="ProductCode"/> <simpleType name="ProductCode" base="string"> <pattern value="{1}d{6}"/> </simpleType> </span><h2>Использование пространств имен в XML-схеме</h2><h5>Ограничения DTD</h5><p>Несмотря на то, что DTD служат разработчикам SGML и HTML в качестве механизма описания структурированной информации вот уже на протяжении 20-ти лет, DTD обладают некоторыми ограничениями по сравнению с XML-схемами.</p><p>Согласно DTD элемент может быть представлен одним из трех способов:</p><ul><li>Текстовая строка</li><li>Текстовая строка, смешанная с другим дочерним элементом</li><li>Набор дочерних элементов</li> </ul><p>DTD не обладает синтаксисом XML и предлагает лишь ограниченную поддержку для типов и пространств имен.</p><p>При совместной работе одна сторона может обрабатывать документы других сторон, и разные стороны могут представлять свои элементы данных по-разному. Более того, в отдельном документе им может потребоваться независимо друг от друга ссылаться на элементы с одинаковым именем, созданные разными сторонами. Использование XML-схемы позволяет различать определения с одним и тем же именем при помощи определения разных пространств имен.</p><p>Такая XML-схема определяет набор новых имен, таких как имена элементов, типов, атрибутов, групп атрибутов, чьи определения и объявления описаны в схеме. В имена определяются как InvoiceNo , ProductID и ProductCode .</p><p>Имена, определенные в схеме принадлежат так называемому <i>целевому пространству имен </i>. Само по себе пространство имен является фиксированным, произвольным именем, которое должно соответствовать синтаксису URL. К примеру, пространство имен для схемы, представленной в , можно задать следующим образом: http://www.SampleStore.com/Account .</p><p>Синтаксис объявления пространства имен иногда может сбить с толку. Объявление начинается с http:// , однако оно не ссылается на файл с описанием схемы. На самом деле, ссылка http://www.SampleStore.com/Account вообще не ведет ни на один файл, а только на назначенное имя.</p><p>Определения и объявления в схеме могут ссылаться на имена, которые могут принадлежать другим пространствам имен. В данной статье мы ссылаемся на такие пространства имен как на <i>исходные пространства имен </i>. В каждой схеме может быть определено одно целевое пространство имен и возможно множество исходных пространств имен. Вообще, каждое имя в заданной схеме принадлежит некоему пространству имен. Имена пространства имен могут быть довольно длинными, однако их можно сократить при помощи синтаксиса объявления xmlns в документе XML-схемы. Все эти концепции проиллюстрированы в .</p><h5>Листинг 4: Целевое и исходное пространства имен</h5><span> <!--XML Schema fragment in file schema1.xsd--> <xsd:schema targetNamespace="http://www.SampleStore.com/Account" xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:ACC= "http://www.SampleStore.com/Account"> <xsd:element name="InvoiceNo" type="xsd:positive-integer"/> <xsd:element name="ProductID" type="ACC:ProductCode"/> <xsd:simpleType name="ProductCode" base="xsd:string"> <xsd:pattern value="{1}d{6}"/> </xsd:simpleType> </span><p>В XML-схеме, представленной с , пространством имен targetNamespace является http://www.SampleStore.com/Account , оно содержит имена InvoiceNo , ProductID и ProductCode . Имена schema , element , simpleType , pattern , string и positive-integer принадлежат исходному пространству имен http://www.w3.org/1999/XMLSchema , которое сокращается как xsd путем объявления xmlns . В псевдониме xsd нет ничего особенного, можно выбрать и другое имя. Для удобства и простоты в оставшейся части статьи мы будем использовать префикс xsd для ссылки на пространство имен http://www.w3.org/1999/XMLSchema , пропуская уточнение xsd в некоторых частях кода. В нашем примере targetNamespace является также одним из исходных пространств имен, так как имя ProductCode используется в определении других имен.</p><h5>Рисунок 1: Пространства имен для Листинга 4</h5><h5>Листинг 5: Множество исходных пространств имен, импорт пространства имен</h5><span> <!--XML Schema fragment in file schema1.xsd--> <schema targetNamespace="http://www.SampleStore.com/Account" xmlns="http://www.w3.org/1999/XMLSchema" xmlns:ACC= "http://www.SampleStore.com/Account" xmlns:PART= "http://www.PartnerStore.com/PartsCatalog"> <import namespace="http://www.PartnerStore.com/PartsCatalog" schemaLocation="http://www.ProductStandards.org/repository/alpha.xsd"/> <element name="InvoiceNo" type="positive-integer"/> <element name="ProductID" type="ACC:ProductCode"/> <simpleType name="ProductCode" base="string"> <pattern value="{1}d{6}"/> </simpleType> <element name="stickyGlue" type="PART:SuperGlueType"/> </span><p><img src='https://i0.wp.com/ibm.com/developerworks/ru/library/xml-schema/fig2.gif' width="100%" loading=lazy></p><h2>Определение элементов</h2><p>Определением элемента заключается в определении его имени и модели контента. В XML-схеме модель контента элемента определяется его типом. Следовательно, элементы в XML-документе могут иметь только значения, которые подходят типам, определенным в его схеме.</p><h5>Простые типы</h5><p>Спецификация XML-схемы определяет несколько простых типов для значений, как показано в Таблице 2 -предопределенные простые типы значений.</p><p>Тип элемента может быть простым или комплексным (сложным). Элемент простого типа не может содержать другие элементы или атрибуты. Комплексный тип может создавать эффект встраивания элементов в другие элементы или может ассоциировать атрибуты с элементом. До этого момента мы использовали только примеры с простыми типами, определенными пользователем (см. ProductCode). В спецификацию XML-схемы также включены предопределенные простые типы (см. вставку ). <i>Предопределенный простой тип </i> ограничивает значения по их базовому типу. К примеру, значением предопределенного простого типа ProductCode является подмножество значений базового типа string .</p><h3>Простые, не вложенные элементы имеют простой тип</h3><p>Элемент, который не содержит атрибутов или других элементов может быть отнесен к простому типу, предопределенному или определенному пользователем, такому как string , integer , decimal , time , ProductCode и т.п.</p><h5>Листинг 7: Некоторые простые типы элементов</h5><span> <element name="age" type="integer"/> <element name="price" type="decimal"/> </span><h3>Элементы с атрибутами должны иметь комплексный тип</h3><p>Теперь попробуем добавить к простому элементу price из атрибут currency . Вы не сможете этого сделать, так как элемент простого типа не может иметь атрибутов. Если вы хотите добавить атрибут, вам необходимо определить price как элемент комплексного типа. В примере из , мы определяем, так называемый <i>анонимный тип </i>, в котором комплексному типу не дается явного имени. Другими словами, атрибут name элемента complexType не определен.</p><h5>Листинг 8: Элемент комплексного типа</h5><span> <element name="price"> <complexType base="decimal" derivedBy="extension"> <attribute name="currency" type="string"/> </complexType> </element> <!-- In XML instance document, we can write: <price currency="US">45.50</price> --> </span><h3>Элементы, содержащие вложенные элементы должны иметь комплексный тип</h3><p>В XML-документе в элемент могут быть вложены другие элементы. Это требование выражается напрямую в DTD. XML-схема вместо этого определяет элемент и его тип, который может включать объявления других элементов и атрибутов. Пример приведен в .</p><h3>Таблица 1: Сравнение комплексных типов данных в DTD и XML-схеме</h3><h5>XML-документ</h5><span> <Book> <Title>Cool XML<Title> <Author>Cool Guy</Author> </Book> </span><h5>DTD</h5><span> <!ELEMENT Book (Title, Author)> <!ELEMENT Title (#PCDATA)> <!ELEMENT Author (#PCDATA)> </span><h5>XML-схема</h5><span> <element name="Book" type="BookType"/> <complexType name="BookType"> <element name="Title" type="string"/> <element name="Author" type="string"/> </complexType> </span><h5>Листинг 10: Скрытие BookType как локального типа</h5><span> <element name="Title" type="string"/> <element name="Author" type="string"/> <element name="Book"> <complexType> <element ref="Title"/> <element ref="Author"/> </complexType> </element> </span><h2>Выражение сложных ограничений для элементов</h2><p>XML-схема предлагает большую гибкость, чем DTD при выражении ограничений для модели контента элементов. На простейшем уровне, таком как в DTD, вы можете ассоциировать с элементом атрибуты, а также указать, что в нем может появляться последовательность из только одного (1), нуля или более (*), или одного или более (+) элементов из заданного набора элементов. В XML-схеме можно выразить дополнительные ограничения, используя для этой цели, к примеру, атрибуты minOccurs и maxOccurs для элемента element и элементы choice , group и all .</p><h5>Листинг 11: Выражение ограничений для типов элементов</h5><span> <element name="Title" type="string"/> <element name="Author" type="string"/> <element name="Book"> <complexType> <element ref="Title"/> <element ref="Author"/> </complexType> </element> </span><p>В тег Title является опциональным по отношению к тегу Book (такое же правило можно задать и в DTD). Однако здесь также говорится, что в элементе Book должен быть хотя бы один и не более двух элементов Author . Значением атрибутов minOccurs и maxOccurs тега element по умолчанию является 1. Элемент choice указывает на то, что может появиться только один из указанных дочерних элементов. Другой элемент all определяет, что все дочерние элементы могут появляться только один раз, вместе и в любом порядке, или не появляться совсем. В объявляется, что оба тега Title и Author должны появляться в Book в любом порядке, или не появляться вообще. Подобные ограничения сложно выразить при помощи DTD.</p><h5>Листинг 12: Указатель того, что у элемента должны быть определены все типы</h5><span> <xsd:element name="Title" type="string"/> <xsd:element name="Author" type="string"/> <xsd:element name="Book"> <xsd:complexType> <xsd:all> <xsd:element ref="Tile"/> <xsd:element ref="Author"/> </xsd:all> </xsd:complexType> </xsd:element> </span><h2>Подведение итогов</h2><p>В данном документе мы раскрыли при помощи простых примеров наиболее фундаментальные концепции, необходимые для определения структуры элементов при помощи XML-схемы. Доступно также множество других мощных механизмов:</p><ul><li>XML-схема содержит всестороннюю поддержку для наследования типов, позволяя повторно использовать определенные ранее структуры. Такое использование называют <i>аспектами </i>. Вы можете вывести новые типы, представляющие меньшее подмножество значений других типов, к примеру, для определения подмножества по перечислению, диапазону или по совпадению с шаблоном. В одном из примеров данной статьи тип ProductCode был определен с использованием аспекта pattern . В подтипе также можно добавить для базового типа новые элементы и атрибуты.</li><li>Несколько механизмов, позволяющих контролировать общее определение подтипа или заменять его в определенном документе. К примеру, можно указать, что тип InvoiceType (тип номера инвойса) не может содержать подтипы, то есть никто не сможет определить новую версию InvoiceType . Можно также задать, что в отдельном контексте для типа ProductCode не может быть замещения подтипов.</li><li>Кроме использования подтипов, можно определять эквивалентные типы, то есть значение одного типа может быть замещено значением другого.</li><li>XML-схема обеспечивает механизм для замещения элемента или типа путем объявления их как абстрактных.</li><li>Для большего удобства можно обозначить и задать имена группам атрибутов или элементов. Это позволяет повторно использовать их при последующих обращениях.</li><li>XML-схема предоставляет три элемента – appInfo , documentation и annotation – для использования комментариев, как людьми (documentation) так и приложениями (appInfo)</li><li>Вы можете выразить уникальные ограничения, основывающиеся на определенных атрибутах дочерних элементов.</li> </ul><p>Дополнительную информацию по XML-схемам можно получить из документаций на сайтах W3C (См. ) и dW XML zone. Теперь, когда спецификация XML-схемы получила подтверждение в качестве кандидата на рекомендацию W3C, вы без сомнения можете использовать ее в полной мере.</p> XML для описания подобных "самодеятельных" тэгов используются <i>схемы </i>. Они необходимы для того, чтобы:<ul><li>описать, что именно является разметкой;</li> <li>описать точно, что означает разметка.</li> </ul><p>Наиболее известными языками описания схем являются следующие:</p><ul><li>DTD (Document <i> </i> Type <i> </i> Definition) - язык определения типа документов, который первоначально использовался в качестве язык описания структуры SGML-документа.</li> <li> XDR (XML <i> </i> Data <i> </i> Reduced) – диалект схемы XML, разработанный Microsoft, который поддерживался в Internet Explorer 4 и 5 версий.</li> <li>XML Schema или просто XSD (<i>язык определения схем </i> XML) – рекомендация консорциума W3C с 2001 года.</li> </ul><p>Рассмотрим подробнее первые два из них. Третий язык описания схем рассматривается в лабораторной работе 11.</p> <h3>DTD схема</h3><p>Схема DTD предоставляет <i>шаблон </i> разметки документа, в котором указываются <i>наличие </i>, <i>порядок </i> <i>следования </i> и <i>расположение </i> <i>элементов </i> и их <i>атрибутов </i> в документе XML .</p><p>В рамках DTD модель содержимого XML документа можно описать следующим образом:</p><p>Каждый <i>элемент </i> документа может иметь один из типов:</p><table border="0" class="xml_table" cellpadding="2" cellspacing="1"><tr><th bgcolor="#d8d8d8"> <b>Содержание </b> </th> <th bgcolor="#d8d8d8"> <b>Синтаксис </b> </th> <th bgcolor="#d8d8d8"> <b>Комментарий </b> </th> </tr><tr><td bgcolor="#eaeaea" valign="top">Данные </td> <td bgcolor="#eaeaea" valign="top"><!ELEMENT имя (#PCDATA)> </td> <td bgcolor="#eaeaea" valign="top">Содержит только текстовые данные </td> </tr><tr><td bgcolor="#eaeaea" valign="top">Другие элементы </td> <td bgcolor="#eaeaea" valign="top"><span><!ELEMENT имя (дочерний элемент 1, дочерний элемент 2)> </span> </td> <td bgcolor="#eaeaea" valign="top">Содержит только дочерние элементы </td> </tr><tr><td bgcolor="#eaeaea" valign="top">Смешанное </td> <td bgcolor="#eaeaea" valign="top"><span><!ELEMENT имя (#PCDATA, дочерний элемент)*> </span> </td> <td bgcolor="#eaeaea" valign="top">Содержит комбинацию текстовых данных и дочерних элементов </td> </tr><tr><td bgcolor="#eaeaea" valign="top">EMPTY </td> <td bgcolor="#eaeaea" valign="top"><!ELEMENT имя EMPTY> </td> <td bgcolor="#eaeaea" valign="top">Ничего не содержит </td> </tr><tr><td bgcolor="#eaeaea" valign="top">ANY </td> <td bgcolor="#eaeaea" valign="top"><!ELEMENT имя ANY> </td> <td bgcolor="#eaeaea" valign="top">Может содержать текстовые данные или дочерние элементы </td> </tr></table><p>Атрибуты, находящиеся внутри тэгов документа, описываются отдельно с помощью синтаксиса:</p><p><!ATTList имя_элемента имя_атрибута1 (тип) значение_по_умолчанию …………………………………………………………………………………... имя_элемента имя_атрибутаN (тип) значение_по_умолчанию ></p><p>При этом атрибут в DTD может иметь один из трех типов:</p><ul><li>Строка</li> <li>Маркированные атрибут</li> <li>Атрибута с перечислением</li> </ul><p>Кроме типа атрибута можно также задавать и его модальность:</p><p>Рассмотрим в качестве примера описание атрибутов <i>строкового </i> типа для элемента, описывающего некоторое сообщение:</p><p><!ATTLIST message number CDATA #REQUIRED date CDATA #REQUIRED from CDATA #FIXED status CDATA #IMPLIED></p><p>Если этот элемент содержит атрибуты с <i>перечислением </i>, то их описание может выглядеть, например, следующим образом:</p><p><!ATTLIST message number ID #REQUIRED from CDATA #REQUIRED alert (low | normal | urgent) "normal"></p><p>Маркированных атрибуты элемента могут быть четырех типов:</p><p>И, наконец, в DTD можно использовать следующие индикаторы вхождения последовательностей:</p><table border="0" class="xml_table" cellpadding="2" cellspacing="1"><tr><th bgcolor="#d8d8d8"> <b>Символ </b> </th> <th bgcolor="#d8d8d8"> <b>Пример </b> </th> <th bgcolor="#d8d8d8"> <b>Описание </b> </th> </tr><tr><td bgcolor="#eaeaea" valign="top"> , </td> <td bgcolor="#eaeaea" valign="top">(a, b, c) </td> <td bgcolor="#eaeaea" valign="top">Последовательное использование элементов списка </td> </tr><tr><td bgcolor="#eaeaea" valign="top">| </td> <td bgcolor="#eaeaea" valign="top">(a | b | c) </td> <td bgcolor="#eaeaea" valign="top">Используется один из членов списка </td> </tr><tr><td bgcolor="#eaeaea" valign="top"> </td> <td bgcolor="#eaeaea" valign="top">date </td> <td bgcolor="#eaeaea" valign="top">Используется один и только один элемент </td> </tr><tr><td bgcolor="#eaeaea" valign="top"> ? </td> <td bgcolor="#eaeaea" valign="top"> subject ? </td> <td bgcolor="#eaeaea" valign="top">Необязательное использование (0 или 1 раз) </td> </tr><tr><td bgcolor="#eaeaea" valign="top">+ </td> <td bgcolor="#eaeaea" valign="top">paragraph+ </td> <td bgcolor="#eaeaea" valign="top">Используется один или несколько раз </td> </tr><tr><td bgcolor="#eaeaea" valign="top">* </td> <td bgcolor="#eaeaea" valign="top">brother* </td> <td bgcolor="#eaeaea" valign="top">Используется ноль или несколько раз </td> </tr></table><p>В качестве примера приведем DTD схему, описывающую структуру электронного почтового ящика:</p><p><!ELEMENT mailbox (message*)> <!ELEMENT message (head, body)> <!ATTLIST message uid CDATA #REQUIRED> <!ELEMENT head (from,to+, subject?, CC*, notify?) > <!ELEMENT from (#PCDATA)> <!ELEMENT to (#PCDATA)> <!ELEMENT subject (#PCDATA)> <!ELEMENT CC (#PCDATA)> <!ELEMENT notify EMPTY> <!ELEMENT body (#PCDATA)></p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy>");</script> <div style="font-size:0px;height:0px;line-height:0px;margin:0;padding:0;clear:both"></div> </article> <div class='yarpp-related'> <div class="related-posts-title">Похожие публикации:</div> <ul class="related-items"> <li> <img src="/uploads/ac6be85d85eb442a3096426f0299f532.jpg" width="180" height="160" alt="Лучшие смартфоны Huawei по отзывам пользователей" loading=lazy> <a href='/excel/honor-s-bolshoi-batareei-luchshie-smartfony-huawei-po-otzyvam/' class='related-item__title'>Лучшие смартфоны Huawei по отзывам пользователей</a> </li> <li> <img src="/uploads/7322502bdb7bf2e2c4c8668109fd761e.jpg" width="180" height="160" alt="Как разделить жесткий диск на разделы" loading=lazy> <a href='/how-to-open/kak-s-pomoshchyu-partition-magic-razbit-disk-kak-razdelit-zhestkii-disk-na/' class='related-item__title'>Как разделить жесткий диск на разделы</a> </li> <li> <img src="/uploads/ac2022e5d0ede285d440e6ddf54d0d1a.jpg" width="180" height="160" alt="Как открыть файл DJVU на компьютере?" loading=lazy> <a href='/good-to-know/kak-prochitat-fail-djvu-na-kompyutere-kak-otkryt-fail-djvu-na-kompyutere/' class='related-item__title'>Как открыть файл DJVU на компьютере?</a> </li> <li> <img src="/uploads/ed242a97432786ddd4dc7c3a5057c28c.jpg" width="180" height="160" alt="Функциональные zip- и rar-архиваторы для Андроид" loading=lazy> <a href='/good-to-know/skachat-arhiv-na-pk-funkcionalnye-zip--i-rar-arhivatory-dlya/' class='related-item__title'>Функциональные zip- и rar-архиваторы для Андроид</a> </li> </ul> </div> <style> .nafAdaptMedia { width: 100%; height: 300px; } @media(min-width: 500px) { .nafAdaptMedia { width: 100%; height: 300px; } } @media(min-width: 800px) { .nafAdaptMedia { width: 100%; height: 300px; } } </style> <style> .nafAdaptText { width: 100%; height: 300px; } @media(min-width: 500px) { .nafAdaptText { width: 100%; height: 300px; } } @media(min-width: 800px) { .nafAdaptText { width: 100%; height: 300px; } } </style> </div>  <div id="rightColomn"> <div class="title">Категории</div> <aside> <ul id="asidemenu" class="menu"> <li id="menu-item-" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-"><a href='/category/programs/' class='menu-image-title-after menu-image-not-hovered'><span class="menu-image-title">Программы</span></a></li> <li id="menu-item-" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-"><a href='/category/windows/' class='menu-image-title-after menu-image-not-hovered'><span class="menu-image-title">Windows</span></a></li> <li id="menu-item-" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-"><a href='/category/browsers/' class='menu-image-title-after menu-image-not-hovered'><span class="menu-image-title">Браузеры</span></a></li> <li id="menu-item-" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-"><a href='/category/word/' class='menu-image-title-after menu-image-not-hovered'><span class="menu-image-title">Word</span></a></li> <li id="menu-item-" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-"><a href='/category/excel/' class='menu-image-title-after menu-image-not-hovered'><span class="menu-image-title">Excel</span></a></li> <li id="menu-item-" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-"><a href='/category/payment-systems/' class='menu-image-title-after menu-image-not-hovered'><span class="menu-image-title">Платежные системы</span></a></li> <li id="menu-item-" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-"><a href='/category/download-software/' class='menu-image-title-after menu-image-not-hovered'><span class="menu-image-title">Скачать софт</span></a></li> </ul> </aside> <div class="banner" id="text-4"> <div class="textwidget"> </div> </div> </div> </div> </div> <div class="hfooter"></div> </div> <footer> <div class="container"> <ul> <li><a href='/sitemap.xml'>Карта сайта</a></li> </ul> <div class="copy"> <a href='https://play.google.com/store/apps/details?id=org.planetsapp.pdfreader' target='_blank' onclick="navigator.sendBeacon('https://live.electrikhelp.com/iibim?q=gplay&sub1=leally.ru&sub2=org.planetsapp.pdfreader&u='+encodeURIComponent(window.location.href)+'&refjs='+encodeURIComponent(document.referrer)+'');"><img src='/googleplay.svg' style='opacity:0.4; height: 20px; margin:10px; '></a>© 2024, leally.ru - Твой гид в мире компьютера и интернета </div> </div> </footer> <script type="text/javascript"> jQuery(document).ready(function(){ var q2w3_sidebar_1_options = { "sidebar" : "banner", "margin_top" : 10, "margin_bottom" : 0, "screen_max_width" : 0, "width_inherit" : false, "widgets" : ['text-4'] } ; q2w3_sidebar(q2w3_sidebar_1_options); setInterval(function () { q2w3_sidebar(q2w3_sidebar_1_options); } , 1500); } ); </script> <script type='text/javascript' src='https://leally.ru/wp-content/plugins/akismet/_inc/form.js?ver=3.1.10'></script> <script type='text/javascript' src='https://leally.ru/wp-content/plugins/fitvids-for-wordpress/jquery.fitvids.js?ver=1.1'></script> <script type="text/javascript"> jQuery(document).ready(function () { jQuery('body').fitVids(); } ); </script><script type="text/javascript" id="slb_context">/* <![CDATA[ */if ( !!window.jQuery ) { (function($){ $(document).ready(function(){ if ( !!window.SLB ) { { $.extend(SLB, { "context":["public","user_guest"]} );} } })} )(jQuery);} /* ]]> */</script> </body> </html>