prev table of contents next

2.3.2 Common Schema Definitions

Different document types (within one project) require different schemas. If the documents share common XML types, they should be written once, in a separate schema file, and re-used from there wherever they are required. The common definitions could be assembled into a namespace of their own, to avoid any conflicts with type or element names in the schemas where they are used. The XML schema snippets given below illustrate this approach.

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://astronomy.org/common"
            xmlns:ast="http://astronomy.org/common">

  <xsd:complexType name="BodyType">
    </xsd:sequence>
      <xsd:element name="name"   type="xsd:ID">
      <xsd:element name="mass"   type="xsd:float">
      <xsd:element name="radius" type="xsd:float">
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>
The definitions from this schema can be used by importing the schema file, e.g.:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:ast="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://astronomy.org/solarsystem"
            xmlns:ss="http://astronomy.org/solarsystem">

  <xsd:import namespace="http://astronomy.org/common"
              schemaLocation="common.xsd"/>

  <xsd:complexType name="MoonType">
    <xsd:extension base="ast:BodyType">
    </xsd:sequence>
      <xsd:element name="planet" type="xsd:IDREF">
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="PlanetType">
    <xsd:extension base="ast:BodyType">
    </xsd:sequence>
      <xsd:element name="moon" type="ss:MoonType"
                   minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>
The schema compiler derives the package names from the URIs given in the namespace definitions, resulting in org.astronomy.common and org.astronomy.solarsystem.

It should also be noted that it is not necessary to have one schema file for each document type. Any top-level element definition (by some xsd:element schema element) is a candidate for a root element, and you may have as many as you like within a single schema. The previous schema snippet might be extended with the following element definitions:

<xsd:schema ...>
  ...
  <xsd:element name="planet" type="ss:PlanetType"/>

  <xsd:element name="solarSystem">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="planet" type="ss:PlanetType"
                     maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
Marshalling either element is possible with a marshaller created from the context based on the package org.astronomy.solarsystem.
Marshaller m = context.createMarshaller();
ObjectFactory of = new ObjectFactory();

// Create a single planet instance document.
PlanetType planet = of.createPlanetType();
//... Add attributes and moons
JAXBElement<PlanetType> jbe = of.createPlanet( planet );
m.marshal( jbe, System.out );

// Create a solar system.
SolarSystem sol = of.createSolarSystem();
//... Add planets.
m.marshal( sol, System.out );


prev table of contents next