Главная » Java, Web, XML » Описание элементов и их атрибутов

0

Элементы, которые будут применяться в документе XML, описываются в схеме компонентом < element>:

<xsd:element пате="имя элемента" type="TMn элемента"

т!п0ссигз="наименьшее число появлений элемента в документе" тах0ссиг5="наибольшее число появлений" />

Значение по умолчанию необязательных атрибутов minoccurs и maxOccurs равно 1. Это означает, что если эти атрибуты отсутствуют, то элемент должен появиться в документе XML ровно один раз. Определение типа элемента можно вынести в тело элемента <element>:

<xsd:element пате="имя элемента" >

Определение типа элемента </xsd:element>

Описание атрибута элемента тоже несложно:

<xsd:attribute name=" имя атрибута’" type="Tnn атрибута"

use="обязательность атрибута" default="3Ha4eHMe по умолчанию" />

Необязательный атрибут use принимает три значения:

?         optional — описываемый атрибут необязателен (это значение по умолчанию);

?           required — описываемый атрибут обязателен;

? prohibited — описываемый атрибут неприменим. Это значение полезно при определении подтипа, чтобы отменить некоторые атрибуты базового типа.

Если описываемый атрибут необязателен, то атрибутом default можно задать его значение по умолчанию.

Определение типа атрибута, — а это должен быть простой тип, — можно вынести в тело элемента <attribute>:

<xsd:attribute пате="имя атрибута">

Тип атрибута </xsd:attribute>

Определение сложных типов

Напомним, что тип элемента называется сложным, если в элемент вложены другие элементы и/или в открывающем теге элемента есть атрибуты.

Сложный тип определяется компонентом <complexType>, имеющим вид: <xsd:complexType пате="имя типа" >Определение Tiina</xsd:complexType>

Необязательный атрибут name задает имя типа, а в теле компонента <complexType> описываются элементы, входящие в сложный тип, и/или атрибуты открывающего тега.

Определение сложного типа можно разделить на определение типа пустого элемента, элемента с простым телом, и элемента, содержащего вложенные элементы. Рассмотрим эти определения подробнее.

2 Зак. 748

Определение типа пустого элемента

Проще всего определяется тип пустого элемента — элемента, не содержащего тела, а содержащего только атрибуты в открывающем теге. Таков, например, элемент <name> листинга 1.2. Каждый атрибут описывается одним компонентом <attribute>, как в предыдущем разделе, например:

<xsd:complexType name="imageType">

<xsd:attribute name="href" type="xsd:anyURI" />’ </xsd:complexType>

После этого определения можно в схеме описать элемент <image> типа imageType.-

<xsd:element name="image" type="imageType" />

а в документе XML использовать это описание: <image href="http: //some. тот/images/myface. gif’ ‘ />

Определение типа элемента с простым телом

Немного сложнее описание элемента, содержащего тело простого типа и атрибуты в открывающем теге. Этот тип отличается от простого типа только наличием атрибутов и определяется компонентом <simpleContent>. В теле этого компонента должен быть либо компонент <restriction>, либо компонент <extension>c атрибутом base, задающим тип (простой) тела описываемого элемента.

В компоненте <extension> описываются атрибуты открывающего тега описываемого элемента. Все вместе выглядит так, как в следующем примере:

<xsd:complexType name="calcResultType">

<xsd:simpleContent>

<xsd:extension base="xsd:decimal">

<xsd:attribute name="unit" type="xsd:string" /> <xsd:attribute name= "precision"

type="xsd:nonNegativeInteger" />

</xsd: extension>

</xsd:simpleContent> </xsd:complexType>

Эту конструкцию можно описать словами так: "Определяется тип элемента, тело которого содержит значения встроенного

простого типа xsd: decimal. Простой тип расширяется тем, что к нему добавляются атрибуты unit И precision".

Если в схеме описать элемент               этого типа следующим образом:

<xsd:element name="result" type="calcResultType" /> то в документе XML можно написать <result unit="cM" precision="2">123.25</result>

В компоненте <restriction>, кроме атрибутов, описывается простой тип тела элемента и/или фасетки, ограничивающие тип, заданный атрибутом base. Например:

<xsd:complexType name="calcResultType">

<xsd:simpleContent>

<xsd: restriction tase="xsd:decimal"> <xsd: totalDigits value=" 8" />

<xsd: attribute name="unit" type="xsd: string" /> <xsd: attribute name="precision"

type="xsd:nonNegativeInteger" /> </xsd:restriction»

</xsd:simpleContent>

</xsd:complexType»

Определение типа вложенных элементов

Если значениями определяемого сложного типа будут элементы, содержащие вложенные элементы, как, например, элементы <address>, <phone-list> листинга 1.2, то перед тем, как перечислять описания вложенных элементов, надо выбрать модель группы (model group) вложенных элементов. Дело в том, что вложенные элементы, составляющие определяемый тип, могут появляться или в определенном порядке, или в произвольном порядке, кроме того, можно выбирать только один из перечисленных элементов. Эта возможность и называется моделью группы элементов. Она определяется одним из трех компонентов <sequence>, <all> ИЛИ cchoice».

Компонент <sequence> применяется в том случае, когда перечисляемые элементы должны записываться в документе в определенном порядке. Пусть, например, мы описываем книгу. Сначала определяем тип:

<xsd:complexType name="bookType">

<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"

/>

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

</xsd:sequence»

</xsd:complexType> Потом описываем элемент:

<xsd:element nams="book" type="booMype" />

Элементы <author>, <title>, <pages> И <publisher> ДОЛЖНЫ входить в элемент <book> именно в таком порядке. В документе XML надо писать:

<book>

<author>H. Ильф, Е. Петров</author» <title>3onoToJi TeneHOK</title> <риЬИзЬег>Детская jmTepaTypa</publisher> </book>

Если же вместо компонента <xsd:sequence> записать компонент <xsd:all>, то элементы <author>, <title>, <pages> и <publisher> можно перечислять в любом порядке.

Компонент <choice> применяется в том случае, когда надо выбрать один из нескольких элементов. Например, при описании журнала вместо издательства, описываемого элементом <publisher>, надо записать название журнала. Это можно определить так:

<xsd:complexType name="bookType">

<xsd:sequence maxOccurs="unbounded">

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

<xsd:element name="title" t^e="xsd:nonnalizedString" />

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

<xsd:choice>

<xsd:element name= "publisher" type="xsd:nom&lizedString" minOccurs="0" />

<xsd:element name= "magazine" tYpe="xBC^:nornalizedString^" min0ccurs="0" />

</xsd:choice»

</xsd:sequence»

</xsd:complexType»

Как видно из этого примера, компонент <choice> можно вложить в компонент <sequence>. Можно, наоборот, вложить компонент <sequence> в компонент <choice>. Такие вложения можно проделать сколько угодно раз. Кроме того, каждая группа в этих моделях может появиться сколько угодно раз, то есть, в компоненте <choice> тоже можно записать атрибут maxOccurs="unbounded".

Модель фуппы <all> ОТЛИЧаеТСЯ В Э1СМ ОТ моделей <sequence> И <choice>. В компоненте <all> не допускается применение компонентов <sequence> и <choice>. Обратно, в компонентах <sequence> и <choice> нельзя применять компонент <all>. Каждый элемент, входящий в группу модели <all>, может появиться не более одного раза, то есть, атрибут maxoccurs этого элемента может равняться только единице.

Определение типа со сложным телом

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

в компоненте                            записывается либо компонент <extension>,

если надо расширить базовый тип, либо компонент <restriction>, если надо сузить базовый тип. Базовый тип указывается атрибутом base, так же как и при записи компонента                                        но теперь это должен быть

сложный, а не простой тип!

Расширим, например, определенный выше тип Ьооктуре, добавив год издания — элемент <уеаг>Г

<xsd:complexType name="newBookType">

<xsd:complexContent>

<xsd: extension base="bookType">

<xsd:sequence>

<xsd: element name="year" type="xsd:gYear"> </xsd:sequence>

</xsd:extension> </xsd:complexContent> </xsd:complexType>

При сужении базового типа компонентом <restriction> надо перечислить те элементы, которые останутся после сужения. Например, оставим в типе newbookType только автора и название книги из типа ЬоокТуре:

<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"            />

</xsd:sequence>

</xsd:restriction> </xsd:complexContent> </xsd:complexType>

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

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

наследуется и тип                       — общий предок всех простых типов.

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

<xsd: complexType name= "ЬоокТуре"> <xsd:complexContent>

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

<xsd: sequence maxOccurs="unbounded">

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

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

<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 и перейдем к примерам.

Литература:

Хабибуллин И. Ш. Разработка Web-служб средствами Java. — СПб.: БХВ-Петербург, 2003. — 400 с: ил.

По теме:

  • Комментарии