Схема XML
Хотя определения DTD в настоящее время являются стандартом определений типов документов XML, у них есть несколько серьезных ограничений. Определения DTD были унаследованы от языка SGML, где они были исходно разработаны для определения языков разметки, а не для создания схем баз данных. Самое существенное ограничение определения DTD заключается в том, что оно не обеспечивает достаточного контроля над содержимым элементов. Например, с помощью DTD невозможно указать, что показанный ниже элемент является допустимым [Today's date — сегодняшняя дата — Примеч. перев. ]:
<todaysdate>09/01/2000</todaysdate>
Точно так же нельзя указать, что следующий элемент не является допустимым:
<todaysdate>Яйца, тост, кофе</todaysdate>
Кроме того, вам может потребоваться задать более точные ограничения на количество появлений элемента в документе. С помощью DTD этого сделать не удастся.
В результате этих ограничений, а также из-за того, что XML все больше используется для хранения данных, были предложены некоторые альтернативные варианты. В настоящее время среди них лидирует язык определений схем XML (XML Schema Definition Language, XSD).
ПРИМЕЧАНИЕ
На момент написания данной книги XSD находится в стадии разработки. Это означает, что к моменту, когда этот язык получит официальный статус, в нем могут произойти значительные изменения по сравнению с нынешней версией. Со спецификацией XSD можно ознакомиться по адресу www.w3.org/XML/Schema.html.
Назначение схем XML то же, что и DTD: определение классов документов XML. Основная разница между ними заключается в том, что в схемах XML все элементы подразделяются на два типа: простые и сложные.
Элементы, которые содержат другие элементы или атрибуты наряду с символьными данными, относятся к типу сложных (complex), а те элементы, которые содержат только символьные данные, называются простыми (simple) элементами. Атрибуты всегда имеют простой тип. В листинге 1.5 показана схема XML для каталога товаров. В листинге 1.6 приведен документ XML, использующий эту схему [On sale date — дата начала продаж, quantity in stock — количество имеющегося в наличии товара. — Примеч. перев. ].
Листинг 1.5. Схема для каталога (catalog.xsd)
<xsd:schema xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<xsd:element name="Catalog" type="CatalogType"/>
<xsd:complexType name="CatalogType">
<xsd:element name="product" type="ProductType"/>
<xsd:attribute name="onSaleDate" type="xsd:date"/>
<xsd:attribute name="partNum" type="Sku"/>
</xsd:complexType>
<xsd:complexType name="ProductType">
<xsd:element name="productName" type="xsd:string"/>
<xsd:element name="quantity_in_stock">
<xsd:simpleType base="xsd:positivelnteger">
<xsd:maxExclusive value="500"/>
</xsd:simpleType>
</xsd:element>
<xsd:element name="pnce" type="xsd'decimal"/>
<xsd:element name="description" type="xsd:string" minOccurs="0"/>
</xsd:complexType>
<xsd:simpleType name="Sku" base="xsd:string">
<xsd:pat tern value="\[A-Z]{3}-[A-Z]{3}d{3}"/>
</xsd:simpleType>
</xsd:schema>
<catalog>
<product partNum="ABC-PR0336" onSaleDate="12/12/2004">
<productName>BigSoft Xtreminator 3.36</productName>
<quantity_in_stock>20</quantity_in_stock >
<price>195.99</price>
<description> Managing your life has never been so easy.</description>
</product>
<product partNura="ABC-PR0343" onSaleDate="12/12/2004">
<productName>E-Dev ProntoWorks</productName>
<quanti ty_in_stock>35</quantity_in_stock >
<price>299.99</price>
<description>The premier integrated rapid e-development suite for busy e-professionals.</description>
</product>
</catalog>
Элементы сложного типа определяются с помощью элемента compl exType. Как было уже сказано, элементы сложного типа содержат другие элементы и атрибуты. Элементы и атрибуты, содержащиеся внутри сложных элементов, определяются с помощью элементов element и attribute соответственно. Например, в листинге 1.5 элемент product определен как элемент сложного типа. Внутри определения типа ProductType определяются пять элементов: productName, quantity_in_stock, price, comment и partNum.
Элементы простого типа не имеют атрибутов и не содержат других элементов. В XSD имеется ряд встроенных простых типов, в том числе string, binary, boolean, double, float и т. д. На основе встроенных простых типов можно сконструировать дополнительные простые типы. В частности, в предыдущем примере определяется простой тип Sku, сконструированный на основании типа string.
Процесс конструирования новых простых типов из уже существующих называется ограничением (restriction). Обратите внимание, что в определении нового типа Sku используется регулярное выражение, задающее шаблон, которому должно соответствовать содержимое любого элемента или атрибута данного типа.
В схемах XSD имеются гораздо более гибкие операторы повторяемости, чем в DTD. Как говорилось выше, в DTD можно указать, что элемент должен встретиться ноль, один, один или более или любое количество раз. В дополнение к этим операторам схема XML позволяет задавать минимальное и максимальное количество повторов одного элемента в документе, его значение или диапазон значений и т. д.