HomeXML Page 2 - Doing More With XML Schemas (part 1)
A Complex Web - XML
Get into the more advanced aspects of XML Schema design with a discussion of simple and complex datatypes, and learn to apply the basic OOP concepts of extensibility and inheritance to your schemas.
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.
When defining complex types, there are two ways in which the definition can be structured. The first involves declaring a complex type via the element, giving it a name, and then using this newly-minted type in a regular <xsd:element> declaration.
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- define a new datatype for a complex element -->
<xsd:complexType
name="starWarsEntity">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element
name="species" type="xsd:string"/>
<xsd:element name="language"
type="xsd:string"/>
<xsd:element name="home" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<!--
create an element of this type -->
<xsd:element name="character" type="starWarsEntity"
/>
</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="character">
<!-- this complex element definition has
no name, and is
referred to as an "anonymous" element -->
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name"
type="xsd:string"/>
<xsd:element name="species" type="xsd:string"/>
<xsd:element name="language" type="xsd:string"/>
<xsd:element name="home" 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.