Мы можем контролировать, каким образом элементы должны использоваться в XML документах. Это позволяют сделать индикаторы.
Всего существует семь индикаторов:
Индикаторы очередности:
- all
- choice
- sequence
Индикаторы частотности:
- maxOccurs
- minOccurs
Индикаторы группирования:
- group name
- attributeGroup name
Индикаторы очередности
Индикаторы очередности, как ясно из названия, используются для определения очередности появления элементов в XML документе.
Индикатор all
Индикатор <all> устанавливает, что дочерние элементы могут появляться в документах в любом порядке, и что каждый из этих дочерних элементов должен появляться всего один раз:
<xs:element name="person">
<xs:complexType>
<xs:all>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
Примечание: При использовании индикатора <all> вы можете установить индикатор <minOccurs> в значение 0 или 1, а индикатор <maxOccurs> только в значение 1 (индикаторы <minOccurs> и <maxOccurs> описываются ниже).
Индикатор choice
Индикатор <choice> устанавливает, что появляться в документах может либо один дочерний элемент, либо другой:
<xs:element name="person">
<xs:complexType>
<xs:choice>
<xs:element name="employee" type="employee"/>
<xs:element name="member" type="member"/>
</xs:choice>
</xs:complexType>
</xs:element>
Индикатор sequence
Индикатор <sequence> устанавливает, что дочерние элементы должны появляться в документах в заданном порядке:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Индикаторы частотности
Индикаторы частотности используются для того, чтобы определить то, как часто элементы могут появляться в XML документах.
Примечание: Для всех "порядковых" и "групповых" индикаторов (any, all, choice, sequence, group name и group reference) значением по умолчанию для maxOccurs и minOccurs является 1.
Индикатор maxOccurs
Индикатор <maxOccurs> устанавливает максимальное количество появлений элемента:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="full_name" type="xs:string"/>
<xs:element name="child_name" type="xs:string" maxOccurs="10"/>
</xs:sequence>
</xs:complexType>
</xs:element>
В приведенном выше примере указывается, что элемент "child_name" в элементе "person" может использоваться минимум один раз (значение по умолчанию для индикатора minOccurs - 1) и максимум 10 раз.
Индикатор minOccurs
Индикатор <minOccurs> устанавливает минимальное количество появлений элемента:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="full_name" type="xs:string"/>
<xs:element name="child_name" type="xs:string" maxOccurs="10" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
В приведенном выше примере указывается, что элемент "child_name" в элементе "person" может использоваться минимум 0 раз и максимум 10 раз.
Совет: Чтобы разрешить использовать какой-то элемент неограниченное число раз, используется выражение maxOccurs="unbounded".
Рабочий пример:
XML файл "Myfamily.xml":
<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="family.xsd">
<person>
<full_name>Hege Refsnes</full_name>
<child_name>Cecilie</child_name>
</person>
<person>
<full_name>Tove Refsnes</full_name>
<child_name>Hege</child_name>
<child_name>Stale</child_name>
<child_name>Jim</child_name>
<child_name>Borge</child_name>
</person>
<person>
<full_name>Stale Refsnes</full_name>
</person>
</persons>
Приведенный XML файл содержит корневой элемент "persons". Внутри этого корневого элемента у нас есть три элемента "person". Каждый элемент "person" должен содержать элемент "full_name" и может содержать до 5 элементов "child_name".
А вот его файл схемы "family.xsd":
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="persons">
<xs:complexType>
<xs:sequence>
<xs:element name="person" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="full_name" type="xs:string"/>
<xs:element name="child_name" type="xs:string" minOccurs="0" maxOccurs="5"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Индикаторы группирования
Индикаторы группирования используются для определения связанных наборов элементов.
Группирование элементов
Группы элементов определяются при помощи декларации group следующим образом:
<xs:group name="имя_группы">
...
</xs:group>
Внутри такой декларации необходимо определять элемент all, choice или sequence. В следующем примере определяется группа с именем "persongroup", которая определяет группу элементов, которые должны появляться точно в указанном порядке:
<xs:group name="persongroup">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="birthday" type="xs:date"/>
</xs:sequence>
</xs:group>
После того как группа элементов была определена, вы можете использовать ее в других определениях:
<xs:group name="persongroup">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="birthday" type="xs:date"/>
</xs:sequence>
</xs:group>
<xs:element name="person" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:group ref="persongroup"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
Группирование атрибутов
Группы атрибутов определяются при помощи декларации attributeGroup:
<xs:attributeGroup name="имя_группы">
...
</xs:attributeGroup>
В следующем примере определяется группа атрибутов с именем "personattrgroup":
<xs:attributeGroup name="personattrgroup">
<xs:attribute name="firstname" type="xs:string"/>
<xs:attribute name="lastname" type="xs:string"/>
<xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>
После того как группа атрибутов была определена, вы можете использовать ее в других определениях:
<xs:attributeGroup name="personattrgroup">
<xs:attribute name="firstname" type="xs:string"/>
<xs:attribute name="lastname" type="xs:string"/>
<xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>
<xs:element name="person">
<xs:complexType>
<xs:attributeGroup ref="personattrgroup"/>
</xs:complexType>
</xs:element>