Coding With Fun
Home Docker Django Node.js Articles Python pip guide FAQ Policy

XML Schema indicator


May 28, 2021 XML Schema


Table of contents


The XSD indicator

In XML Schema, there are seven types of indicators, which are described in this section.


With indicators, we can control how elements are used in documents.


Indicator

There are seven indicators:

Order indicator:

  • All
  • Choice
  • Sequence

Occurrence indicator:

  • maxOccurs
  • minOccurs

Group indicator:

  • Group name
  • attributeGroup name

Order indicator

The Order indicator is used to define the order of elements.

All indicator

The indicator states that child elements can appear in any order, and that each child element must appear only once:

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

Note: When using the .lt;all?gt; indicator, you can set the .lt;minOccurs?gt; to 0 or 1, and only the .lt;maxOccurs?gt; indicator to 1 (as explained later, .lt;minOccurs?gt; and .lt;maxOccurs?gt;).

Choice indicator

The indicator specifies that one child element may appear or another child element may appear (either or not):

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

It is stipulated that child elements must appear in a specific order:

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


Occurrence indicator

The Occurrence indicator is used to define how often an element appears.

Note: For all "Order" and "Group" indicators (any, all, choice, sequence, group name, and group reference), the default values for maxOccurs and minOccurs are 1.

maxOccurs indicator

The indicator can specify the maximum number of times an element can appear:

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

The example above shows that the child element "child_name" can appear at least once in the "person" element (where the default value for minOccurs is 1) and up to 10 times.

minOccurs indicator

The indicator specifies the minimum number of times an element can occur:

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

The example above shows that the child element "child_name" can appear in the "person" element at least 0 times and up to 10 times.

Tip: To make the number of times an element appears unrestricted, use the maxOccurs-"unbounded" statement:

A practical example:

XML file .xml "Myfamily":

<?xml version="1.0" encoding="ISO-8859-1"?>

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

The above XML file contains a root element called "persons". I nside this root element, we define three "person" elements. Each "person" element must contain a "full_name" element, and it can contain up to 5 "child_name" elements.

This is the schema file "family.xsd":

<?xml version="1.0" encoding="ISO-8859-1"?>
<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 indicator

The Group indicator is used to define several batches of related elements.

The element group

Element groups are defined by group declarations:

<xs:group name="groupname">
...
</xs:group>

You must define an all, option, or sequence element within the group declaration. The following example defines a group called "persongroup" that defines a set of elements that must appear in exact order:

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

After you have defined the group, you can refer to it in another definition:

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

The property group

Property groups are defined by attributeGroup declarations:

<xs:attributeGroup name="groupname">
...
</xs:attributeGroup>

The following example defines a property group named "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>

Once you've defined the property group, you can reference it in another definition, like this:

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