XSD Tutorial Parts
- Elements and Attributes
- Conventions and Recommendations
- Extending Existing Types
- Namespaces
- Other Useful bits...
Introduction
This section covers a few of the lesser used constructs:
Element and Attribute Groups
Element
s and Attribute
s can be grouped together using <xs:group>
and <xs:attributeGroup>
. These groups can then be referred to elsewhere within the schema. Groups must have a unique name
and be defined as children of the <xs:schema>
element
. When a group is referred to, it is as if its contents have been copied into the location it is referenced from.
Note: <xs:group>
and <xs:attributeGroup>
cannot be extended or restricted in the way <xs:complexType>
or <xs:simpleType>
can. They are purely to group a number of items of data that are always used together. For this reason, they are not the first choice of constructs for building reusable maintainable schemas, but they can have their uses.
<xs:group name="CustomerDataGroup">
<xs:sequence>
<xs:element name="Forename" type="xs:string" />
<xs:element name="Surname" type="xs:string" />
<xs:element name="Dob" type="xs:date" />
</xs:sequence>
</xs:group>
<xs:attributeGroup name="DobPropertiesGroup">
<xs:attribute name="Day" type="xs:string" />
<xs:attribute name="Month" type="xs:string" />
<xs:attribute name="Year" type="xs:integer" />
</xs:attributeGroup>
These groups can then be referenced in the definition of complex type
s, as shown below.
<xs:complexType name="Customer">
<xs:sequence>
<xs:group ref="CustomerDataGroup"/>
<xs:element name="..." type="..."/>
</xs:sequence>
<xs:attributeGroup ref="DobPropertiesGroup"/>
</xs:complexType>
The <any> Element
The <xs:any>
construct allows us specify that our XML document can contain element
s that are not defined in this schema. A typical use for this is when you define a message
envelope. For example, the message
payload is unknown to the system, but we can still validate the message
.
Look at the following schema:
<xs:element name="Message">
<xs:complexType>
<xs:sequence>
<xs:element name="DateSent" type="xs:date" />
<xs:element name="Sender" type="xs:string" />
<xs:element name="Content">
<xs:complexType>
<xs:sequence>
<xs:any />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
We have defined an element
called "Message
", which must have a "DateSent
" child element
(which is a date
), a "Sender
" child element
(which must be a string
), and a "Content
" child element
- which can contain any element
- it doesn't even have to be described in the schema.
So the following XML would be acceptable.
<Message>
<DateSent>2000-01-12</DateSent>
<Sender>Admin</Sender>
<Content>
<AccountCreationRequest>
<AccountName>Fred</AccountName>
</AccountCreationRequest>
</Content>
</Message>
The <xs:any>
construct has a number of properties that can further restrict what can be used in its place.
minOccurs
and maxOccurs
allows you to specify how may instances of undefined element
s must be placed within the XML document.
Namespace allows you to specify that the undefined element
"must" belong to the given namespace. This may be a list of namespace's (space separated). There are also 3 built in values ##any
, ##other
, ##targetnamespace
, ##local
. Consult the XSD standard for more information on this.
processContents
tells the XML parser how to deal with the unknown element
s. The values are:
Skip
- no validation is performed - but it must be well formed XML. Lax
- if there is a schema to validate the element
, then it must be valid against it, if there is no schema, then that's OK. Strict
- There must be a definition for the element
available to the parser, and it must be valid against it.
<anyAttribute>
<xs:anyAttribute>
works in exactly the same way as <xs:any>
, except it allows unknown attribute
s to be inserted into a given element
.
<xs:element name="Sender">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:anyAttribute />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
This would mean that we can add any attribute
s we like to the Sender
element
, and the XML document would still be valid.
<Sender ID="7687">Fred</Sender>