tags:

views:

62

answers:

2

In my schema I have some types that simply extend a simple XSD type (int or string). JAXB creates a separate java class per such type. I want to drop this intermediate class and configure JAXB to use primitives where possible (e.g. substitute CountryType with java.lang.String and DocumentType with int or lava.lang.Integer). For example, for a given XSD it would be nice to have DestinationType.setDocumentType(int) and List<String> StatesType.getCountry(). I am happy to write type-wide an adapter for that, but it looks like only conversions from primitive XML types are supported. Maybe it is possible to make per-property type conversion? Please, give any example of JAXB binding customization, that can help.

<?xml version="1.0" encoding="UTF-8"?>
<schema
    xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:exch="http://www.mycompany.org/exchange"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    targetNamespace="http://www.mycompany.org/exchange"
    elementFormDefault="qualified" attributeFormDefault="unqualified">

    <complexType name="countryType">
        <simpleContent>
            <extension base="string"/>
        </simpleContent>
    </complexType>

    <complexType name="statesType">
        <sequence maxOccurs="unbounded">
            <element name="country" type="exch:countryType"/>
        </sequence>
    </complexType>

    <complexType name="documentType">
        <simpleContent>
            <extension base="integer"/>
        </simpleContent>
    </complexType>

    <complexType name="destinationType">
        <sequence>
            <element name="states" type="exch:statesType" maxOccurs="1"/>
            <element name="document-type" type="exch:documentType" minOccurs="1" maxOccurs="1"/>
        </sequence>
    </complexType>
</schema>
A: 

Good question. In the past I've solved this by running the schema through an XSLT pre-processing step, "flattening" the type hierarchy whilst retaining the semantics of the documents.

For example, the XSLT would drop the definition of the documentType type, and replace every reference to documentType with integer. The resulting processed schema still represents the same instance documents, but is simpler, and makes for a nicer binding.

This (rather half-baked) solution can apply to a number of similar problems to do with over-complex schema (e.g. replacing substitution groups with choice structures).

skaffman
+2  A: 

Another possibility, can you change your schema?:

The following schema change will generate your desired object model.

Use:

<simpleType name="documentType">
    <restriction base="integer"/>
</simpleType>

Instead of:

<complexType name="documentType"> 
    <simpleContent> 
        <extension base="integer"/> 
    </simpleContent> 
</complexType> 
Blaise Doughan
@Blaise Doughan: Can this transformation be applied without breaking the compatibility of serialized XML?
dma_k
@dma_k - Yes, the XML representations for both types is the same.
Blaise Doughan