Java Architecture for XML Binding

First of all we need to download and install JAXB in your pc. (See below for links)

After install, we can proceed defining a XSD file. An example jb.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:jb="urn:org:jblanco:example:expedient:1.0:schema"
xmlns:cmn="urn:org:jblanco:common:1.0:schema"
targetNamespace="urn:org:jblanco:example:expedient:1.0:schema"
elementFormDefault="qualified" attributeFormDefault="unqualified">

<xs:annotation>
<xs:documentation xml:lang="en">
Expedient.
</xs:documentation>
</xs:annotation>
<xs:import id="cmn" namespace="urn:org:jblanco:common:1.0:schema" schemaLocation="common.xsd" />
<xs:element name="expediente" type="jb:expedienteType" />
<xs:complexType name="expedienteType">
<xs:complexContent>
<xs:extension base="cmn:generalType" >
<xs:sequence>
<xs:element name="numero_expediente" minOccurs="1" maxOccurs="1" type="xs:string" />
<xs:element name="fecha_apertura" minOccurs="1" maxOccurs="1" type="xs:date" />
<xs:element name="fecha_cierre" minOccurs="1" maxOccurs="1" type="xs:date" />
<xs:element name="volumen" minOccurs="1" maxOccurs="1" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

</xs:schema>


Don't forget namespaces, inheritance... ;)

Finally, execute XJC command to generate java classes:

xjc -p org.jblanco.example.bean jb.xsd

xjc -p <package> xsd_file.xsd

Output:

jblanco@in2:/opt/tmp$ xjc -p org.jblanco.example.bean jb.xsd
parsing a schema...
compiling a schema...
org/jblanco/example/bean/ExpedienteType.java
org/jblanco/example/bean/ObjectFactory.java
org/jblanco/example/bean/package-info.java


To use multiple xsd files add an import, for every xsd you want, in the main file.

Hint:

To create an object with multiple inheritance, we can use group tag. An example:

<xs:complexType name="complex1Type">
<xs:sequence>
<xs:group ref="cmn:metaGrp1Group" />
<xs:group ref="cmn:metaGrp2Group" />
</xs:sequence>
</xs:complexType>


<xs:group name="metaGrp1Group">
<xs:sequence>
<xs:element name="identificador" minOccurs="1" maxOccurs="1" type="xs:string" />
<xs:element name="fecha" minOccurs="1" maxOccurs="1" type="xs:date" />
<xs:group ref="cmn:metaSubgrp1Group" />
</xs:sequence>
</xs:group>
<xs:group name="metaSubgrp1Group">
<xs:sequence>
<xs:element name="nivel" minOccurs="1" maxOccurs="1" type="cmn:nivelType" />
</xs:sequence>
</xs:group>
<xs:group name="metaGrp2Group">
<xs:sequence>
<xs:element name="codigo" type="xs:string" minOccurs="1" maxOccurs="1" />
<xs:element name="serie" type="xs:string" minOccurs="1" maxOccurs="1" />
</xs:sequence>
</xs:group>

<xs:simpleType name="nivelType">
<xs:restriction base="xs:string">
<xs:enumeration value="Unidad" />
<xs:enumeration value="Expediente" />
<xs:enumeration value="Compuesta" />
</xs:restriction>
</xs:simpleType>


Links used in this note: