Imagine a technology that offered you all the power of a DTD without the associated unpleasantness of those strange symbols and arcane commands. Sounds too good to be true? Say hello to XML Schema.
As stated above, complex elements can contain other (simple or complex) elements,
and may also possess additional attributes. Corresponding to this, complex element definitions within a schema can contain definitions for other (simple or complex) elements, definitions for element attributes (if any), and references to other element definitions within the schema (more on this later).
When defining complex types, there are again two ways in which the definition can be structured. The first involves defining a complex type, giving it a name, and then using this newly-minted type in a regular <xsd:element> declaration.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- define
a new datatype for a complex element -->
<xsd:complexType name="complexDType">
<xsd:sequence>
<xsd:element
name="title" type="xsd:string"/>
<xsd:element name="director" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<!--
create an element of this type -->
<xsd:element name="movie" type="complexDType"
/>
</xsd:schema>
The second option involves combining the two steps above into a single step -
the definition of the complex element is embedded within the <xsd:element> declaration itself.
Here's how the XML snippet above would be represented in a schema.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element
name="movie">
<!-- this complex element definition has no name, and is referred
to as
an "anonymous" element -->
<xsd:complexType>
<xsd:sequence>
<xsd:element
name="title" type="xsd:string"/>
<xsd:element name="director" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
The advantage of creating a named type should be obvious - the new type, once
defined, can be used in multiple places within the schema simply by referencing it by name. The following example illustrates this:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- define
a new datatype -->
<xsd:simpleType name="simpleDType">
<xsd:restriction
base="xsd:integer">
<!-- restrict integer values between 1 and 10 -->
<xsd:minInclusive
value="1"/>
<xsd:maxInclusive value="10"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element
name="movie">
<!-- this complex element definition has no name, and is referred
to as
an "anonymous" element -->
<xsd:complexType>
<xsd:sequence>
<!--
simple elements using built-in types -->
<xsd:element name="title" type="xsd:string"/>
<xsd:element
name="director" type="xsd:string"/>
<!-- simple element using new derived
type -->
<xsd:element name="rating" type="simpleDType"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>