Есть несколько ограничений для XML документа, тэги должны совпадать и правильно размещаться, атрибуты должны быть уникальными. О документе говорят, что он хорошо форматирован, когда он удовлетворяет этим простым правилам. Это несколько больше, чем просто убедиться, что XML данные будут представлены в виде дерева категорий.
Более строгие правила могут применяться к документу, если ожидается, что XML соответствует определенной грамматике. XML приложение имеет спецификацию синтаксиса и семантики структуры данных. Определение типа документа DTD (document type definition) или XML Схема предоставляет правила структурирования, которым должен удовлетворять XML документ, чтобы быть "достоверным". Использование DTD несколько неудовлетворительно, поэтому сейчас XML схемы становится стандартом для определения XML грамматики.
Вот схема для примера tij_menu.xml - tij_menu.xsd:
<xsd:schema xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <xsd:annotation> <xsd:documentation> TIJ Restaurant Menu Schema. </xsd:documentation> </xsd:annotation> <xsd:element name="restaurant" type="restaurantType" /> <xsd:complexType name="restaurantType"> <xsd:element name="name" type="xsd:string" /> <xsd:element name="address" type="addressType" /> <xsd:element name="phone" type="xsd:string" /> <xsd:element name="menu" type="menuType" /> </xsd:complexType> <xsd:complexType name="menuType"> <xsd:attribute name="desc" type="xsd:string" /> <xsd:element name="menugroup" type="menugroupType" minOccurs="1" maxOccurs="unbounded" /> </xsd:complexType> <xsd:complexType name="menugroupType"> <xsd:element name="menuitem" minOccurs="1" maxOccurs="unbounded"> <xsd:complexType> <xsd:element name="name" type="xsd:string" minOccurs="1" /> <xsd:element name="price" type="xsd:string" minOccurs="0" /> <xsd:element name="description" type="xsd:string" minOccurs="0" /> </xsd:complexType> </xsd:element> </xsd:complexType> </xsd:schema>
Схема XML предоставляют богатую грамматическую структуру для XML документа, который перекрывает ограничения DTD. Ее цель состоит в том, чтобы убедиться, что XML документ построен в соответствии с требованиями, составляющими схему. Это позволяет использовать совместно аналогичные данные, например, составить заказ или меню. Если мы хотим запустить службу меню, которая позволяет пользователям просматривать меню ресторанов в своем районе, мы можем пожелать, чтобы все отправляемые меню приходили в специфическом формате. Или попросить, чтобы все отправляемые меню приходили со своим собственным дескриптором формата, чтобы мы могли преобразовать его.
В tij_menu.xml <restaurant> является корневым элементом и он содержит различные вложенные элементы. В терминах схемы, элементы, которые содержат вложенные элементы, или имеют атрибуты, являются сложными типами. Элементы, которые содержат только простые данные, такие как числа, строки или даты, но не имеют вложенных элементов, являются простыми типами. Атрибуты всегда являются простыми типами, поскольку значения атрибутов не могут содержать никакие структуры. Если мы взглянем на документ, как на дерево, то увидим, что простые типы не имеют дочерних узлов, в то время как сложные типы могут иметь их.
Отличия между простыми и сложными типами очень важно, поскольку вы декларируете простые и сложные типы отдельно. Вы декларируете сложные типы сами, а спецификации XML схемы сопутствуют многие простые, уже задекларированные типы.
Это пример декларации простого типа. Типами обычно являются стоки, целые числа, десятичные числа, время и т.п. Допустим, что это не лучшая структура для прайса и мы можем сделать лучше. Мы решили добавить в качестве атрибута валюту прайса. Это недопустимо, элемент простого типа не может иметь атрибутов. Так что мы меняем прайс на сложный тип.
<xsd:complexType name="price"> <xsd:base ="decimal" /> <xsd:attribute name="currency" type="string" /> </xsd:complexType>
Элементы, в которые вставлены другие элементы, должны быть сложными типами. Для приведенной выше схемы вы можете увидеть, что <restaurant> содержит <menu>, <menu> содержит <menugroup>, а <menugroup> содержать <menuitem>. Ограничения могут быть наложены на значения элементов посредством использования minOccurs and maxOccurs. По умолчанию эти значения равны 1 для элемента. В tij_menu.xml необходимо иметь много элементов <menuitem> внутри <menugroup>, так что мы устанавливаем значение maxOccurs в величину -- не ограничено.
Создание хорошо форматированного и достоверного XML документа - это двух этапный процесс. Научиться писать XML, как мы это видели, просто, для этого очень мало правил. Далее, вы должны выучить XML приложение (-ния), которое вы будете использовать. Это обычно стандарт или спецификация, определенная сторонней организацией, согласно которой вы должны организовать свои данные. Данные должны быть прочитаны и должен быть создан достоверный XML документ, в который помещаются ваши данные в том формате, который могут понимать другие программы.
← | Пространство имен XML | Синтаксический анализатор с проверкой достоверности: SAX и DOM | → |