XML Schema and XMLspy notes
Introduction
An xml documents consists of elements, attributes and text.
There are two structures in an xml document:
simple ( contains only text ) can ba either Built-in, or Derived
complex ( has attributes or child elements, and possibly texts as well)
Restriction on values:
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction> </xs:simpleType>
</xs:element>
To limited the content of an XML element to a set of acceptable values, we can use the enumeration constraint:
<xs:element name="car" type="carType"/>
<xs:simpleType name="carType">
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
Restrictions on a Series of Values
<xs:element name="initials">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z][A-Z][A-Z]"/>
<xs:pattern value="[a-zA-Z0-9]{8}"/>
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
xs:schema is the root element of the XSD document
<xs: schame
xmlns:xs="http://www.w3.org/2001/XMLSchema" //must have the namespace declaration (Schema for schemas i.e. "http://www.w3.org/2001/XMLSchema")
version="1.1">
...
...
</xs:schema> under xs:schema (global:can be referenced)/further down the schema hierarchy (local)
global elements also can be substituted by another element!
xs:schema cam contain the following child elements:
- xs:include
- xs:import
- xs:override new to XML Schema 1.1
- xs:element
- xs:attribute
- xs:group enables you to specidy constraints on a specific set of sub-elements
- xs:attributeGroup
- xs:annotation can contain two child elements: xs:appinfo/xs:documentation
- xs:defaultOpenContent new to XML Schema 1.1
- xs:simpleType or
- xs:complexType re-use previous definitions (base="complexTypeName", type="complexTypeName")
i.e.
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2014(x64) (http://www.altova.com) by Christian Luntzer (Altova GmbH) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.1">
<xs:element name="city" type="xs:string" default="MainStreet"/>
//global element name is mandatory, type is optional
<xs:element name="shoesize"> //Complex Element type1: simple contents
<xs:complexType> //Only contains simple contents: text, attributes
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="country" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="address">
<xs:complexType> //Complex element Type2: mixed contents
<xs:annotation>
<xs:documentation>type which contains driver....
</xs:documentation>
</xs:annotation>
<xs:sequence mixed="ture"> //contains mixed contents
<xs:element name="street" type="xs:string"/> //local element declaration "street", mandatory
<xs:element ref="city"/>//local element reference"city", name and type attribute cannot be present </xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="product"> //Complex element Type3: only attribute content
<xs:complexType>
<xs:complexContent>
<xs:restriction base="xs:integer“>
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:schema>
Attributes only can be simple, not complex
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2014(x64) (http://www.altova.com) by Christian Luntzer (Altova GmbH) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.1">
<xs:element name="gift_voucher">
<xs:complexType>
<xs:attribute ref="voucher_id"/> //local attribute reference to a global attribute declaration
<xs:attribute name="expiry_date" type="xs:date"/> //(local attribute) name is mandatory, type is optional </xs:complexType>
</xs:element>
<xs:attribute name="voucher_id" type="xs:positiveInteger"/> global attribute declaration
<xs:element name="person"> //MinOccurs and MaxOccurs can be used for both element and group
<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>
</xs:schema>
default/fixed: mutually exclusive
If an element appeas but is empty, the schema processor provides the default value. If the element is missing, the schema processor does not provide the default value.
Cannot appear on local element references.
Attribute's default value will provide a default value for an attribute if the attribute is missing from the xml document. It will not provide a default value for a missing element.
Group must be defined globally, though the local reference to a globally named group can exist.
unnamed groups (compositors): xs:sequence; xs:choice; xs:all also can be used foe complex element
<xs:group name="vehiclegroup" minOccurs="1" maxOccurs="1">
<xs:choice> //only one sub-element can be used from a list of sub-elements
<xs:element name="car"/>
<xs:element name="motorbike"/>
</xs:choice>
</xs:group>
<xs:element name="car" type="carinfo"/>
<xs:complexType name="carinfo">
<xs:sequence>
<xs:group ref="vehiclegroup"/> //re-using a group definition , the referenced element has to be a global one.
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
attributeGroup situations arise where there are several different elements that will require the same set of attributes.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.1">
<xs:element name="person">
<xs:complexType>
<xs:attributeGroup ref="dimensions"/>
</xs:complexType>
</xs:element>
<xs:attributeGroup name="dimensions">
<xs:attribute name="height" type="xs:positiveInteger"/>
<xs:attribute name="weight" type="xs:positiveInteger"/>
</xs:attributeGroup>
</xs:schema>
Built-in datatypes
only one complex datatype:
<xs: element name="para" type="xs:anyType"/> ==<xs:element name="pare"/>
User-defined Simple Types
simple types can only be derived via restriction. This mean that the derived simple type will only allow a base type it is being derived from. The base type is more general, the derived type is more specific.
Namespaces
Mixing Several Namespaces
<gs:dish xmlns: gs = “http://china.com“
xmlns: uom = “http://units.com“>
<gs:dm uom:unit = “cm“>20</gs:dm>
<gs:vol uom:unit = “1“>5</gs:vol>
<gs:decor>Meissner</gs:decor>
<comment>This is an unqualified element name</comment>
</gs:dish>