Индикаторы использования XML элементов

Мы можем контролировать, каким образом элементы должны использоваться в 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>