Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 465

Ильдар Шаукатович Хабибуллин

<xsd:complexType name="newBookType">

<xsd:complexContent>

<xsd:restriction base="bookType">

<xsd:sequence>

<xsd:element name="author" type="xsd:normalizedString" minOccurs="0" />

<xsd:element name="title" type="xsd:normalizedString" />

</xsd:sequence>

</xsd:restriction>

</xsd:complexContent>

</xsd:complexType>

Это описание выглядит странно. Почему надо заново описывать все элементы, остающиеся после сужения? Не проще ли определить новый тип?

Дело в том, что в язык XSD внесены элементы объектно-ориентированного программирования, которых мы не будем касаться. Расширенный и суженный типы связаны со своим базовым типом отношением наследования, и к ним можно применить операцию подстановки. У всех типов языка XSD есть общий предок базовый тип anyType. От

него наследуются все сложные типы. Это подобно тому, как у всех классов Java есть общий предок — класс Object, а все массивы наследуются от него. От базового типа anyType наследуется и тип anySimpleType — общий предок всех простых типов.

Таким образом, сложные типы определяются как сужение типа anyType. Если строго подходить к определению сложного типа, то определение типа bookType, сделанное в начале предыдущего раздела, надо записать так:

<xsd:complexType name="bookType">

<xsd:complexContent>

<xsd:restriction base="xsd:anyType">

<xsd:sequence maxOccurs="unbounded">

<xsd:element name="author" type="xsd:normalizedString" minOccurs="0" />

<xsd:element name="title" type="xsd:normalizedString" />

<xsd:element name="pages" type="xsd:positiveInteger" minOccurs="0" />

<xsd:element name="publisher" type="xsd:normalizedString" minOccurs="0" />

</xsd:sequence>

</xsd:restriction>

</xsd:complexContent>

</xsd:complexType>

Рекомендация языка XSD позволяет сократить эту запись, что мы и сделали в предыдущем разделе. Это подобно тому, как в Java мы опускаем слова "extends Object" в заголовке описания класса.

Закончим на этом описание языка XSD и перейдем к примерам.

Пример: схема адресной книги

В листинге 28.4 записана схема документа, приведенного в листинге 28.2.

Листинг 28.4. Схема документа XML

<?xml version="1.0"?>

<xsd:schema xmlns:xsd=""

xmlns:ntb="" targetNamespace="">

<xsd:element name="notebook" type="ntb:notebookType" />

<xsd:complexType name="notebookType">

<xsd:element name="person" type="ntb:personType"

minOccurs="0" maxOccurs="unbounded" />

<xsd:complexType name="personType">

<xsd:sequence>

<xsd:element name="name">

<xsd:complexType>

<xsd:attribute name="first" type="xsd:string" use="optional" />

<xsd:attribute name="second" type="xsd:string" use="optional" /> <xsd:attribute name="surname" type="xsd:string" use="required" /> </xsd:complexType>