Complex types

You can use mixed content in a schema and an XML document.

Mixed content in a schema and XML document

This example demonstrates the use of mixed content in a schema and an XML document. The schema contains an element of type int and an element of type string.

Here is the schema:

<element name="observation">
    <complexType mixed="true">
       <sequence>
          <element name="temperature" type="int">
          <element name="city" type="string">
       </sequence>
    ...
    </complexType>
</element>

Here is the excerpt from an XML document:

<observation>
It is <temperature>10</temperature>degrees in <city>London</city>.
</observation>

And here is the XOM representation:

class Observation extends IlrXmlObject
{
   int temperature;
   String city;
   String content;
}

The content of the observation element is translated to a single String that concatenates all the strings and put in a special attribute named content.

Complex type mapping

The following table shows some complex type mappings between a schema and dynamic model.

Table 1. Standard complex type mapping 
Case Schema Dynamic model
Element with local complex type of unary component
<element name=”e1”>
  <complexType>
    <sequence>
     <element name=”e2” type=”t2”/>
     <element name=”e3” type=”t3”/>
    </sequence>
    <attribute name=”a1” type=”t4”/>
  </complexType>
</element>
class E1 extends IlrXmlObject
{
  [map(t2)] e2;
  [map(t3)] e3;
  [map(t4)] a1;
}
E1 e1;
Element with local complex type of unary component
<element name=”e1”>
  <complexType>
   <sequence>
    <element name=”e2” type=”t2”
              maxOccurs=”unbounded”/>
    <element name=”e3” type=”t3”
              minOccurs=”2” />
   </sequence>
  </complexType>
</element>
class E1 extends IlrXmlObject
{
  // collection of [map(t2)]
  Vector e2List;
  // collection of [map(t3)]
  Vector e3List;
}
E1 e1;
Typed element
<complexType name=”t1”>
 <sequence>
   <element name=”e2” type=”t2”/>
   <element name=”e3” type=”t3”/>
 </sequence>
</complexType>
<element name=”e1” type=”t1” />
class T1 extends IlrXmlObject
{
  [map(t2)] e2;
  [map(t3)] e3;
}
T1 e1;
Typed element with collection group
<complexType name=”t1”>
 <sequence maxOccurs=”1001”>
   <element name=”e2” type=”t2”/>
   <element name=”e3” type=”t3”/>
 </sequence>
</complexType>
<element name=”e1” type=”t1” />
class T1 extends IlrXmlObject
{
  // collection of [map(t2)]
  Vector e2List;
 // collection of [map(t3)]
  Vector e3List;
}
T1 e1;
Local complex type: when inner classes are permitted
<complexType name=”t1”>
  <sequence>
    <element name=”e1”>
      <complexType>
      …
      </complexType>
  </complexType>
</element>
class T1 extends IlrXmlObject
{
   class E1 extends IlrXmlObject
   {
       … 
    }
    E1 e1;
}
Local complex type: when inner classes are not permitted
<complexType name=”t1”>
  <sequence>
    <element name=”e1”>
      <complexType>
      …
      </complexType>
  </complexType>
</element>
Class E1 extends IlrXmlObject
{
}
class T1 extends IlrXmlObject
{
    E1 e1;
}

Simple content mapping

The following table shows some simple content mappings between a schema and dynamic model.

Table 2. Simple content mapping 
Case Schema Dynamic model
Complex type with simple content
<simpleType name=”st0” >
…
</simpleType>
<complexType name=”ct0”>
 <simpleContent>
  <extension base=”st0”> 
   <attribute name=”a1” type=”st1” />
  </extension>
 <simpleContent>
</complexType>
class Ct0 extends IlrXmlObject
{
  [map(st0)] content;
  [map(st1)] a1;
}
Complex type inheriting by extension from complex type with simple content
<complexType name=”ct0” >
  <simpleContent>
  …
  <simpleContent>
</complexType>
<complexType name=”ct1”>
 <simpleContent>
  <extension base=”ct0”> 
   <attribute name=”a1” type=”st1” />
  </extension>
 </simpleContent>
</complexType>
class Ct0 extends IlrXmlObject
{
  [map(st0)] content;
  …
}
class Ct1 extends Ct0
{
  [map(st0)] content;
  [map(st1)] a1;
  …
}
Complex type inheriting by restriction from complex type with simple content
<complexType name=”ct0” >
  <simpleContent>
  …
  <simpleContent>
</complexType>
<complexType name=”ct1”>
 <simpleContent>
  <restriction base=”ct0”> 
   <attribute name=”a1” type=”st1” />
  </restriction>
 <simpleContent>
</complexType>
class Ct0 extends IlrXmlObject
{
  [map(st0)] content;
  …
}
class Ct1 extends Ct0
{
}

Complex content mapping

The following table shows some complex content mappings between a schema and dynamic model.

Table 3. Complex content mapping 
Case Schema Dynamic model
Complex type inheriting by extension
<complexType name=”ct0”>
   <attribute name=”a1” type=”st1” />
</complexType>
<complexType name=”ct0”>
 <complexContent>
  <extension base=”ct0”> 
   <attribute name=”a2” type=”st2” />
  </extension>
 <complexContent>
</complexType>
class Ct0 extends IlrXmlObject
{
  [map(st1)] a1;
}
class Ct1 extends Ct0
{
  [map(st2)] a2;
}
Complex type inheriting by restriction
<complexType name=”ct0”>
   <attribute name=”a1” type=”st1” />
</complexType>
<complexType name=”ct0”>
 <complexContent>
  <restriction base=”ct0”> 
   <attribute name=”a1” type=”st2” />
  </restriction>
 <complexContent>
</complexType>
class Ct0 extends IlrXmlObject
{
  [map(st1)] a1;
}
class Ct1 extends Ct0
{
}
Complex type with mixed content, inheriting by extension
<complexType name=”ct0” >
  <simpleContent>
  …
  </simpleContent>
</complexType>
<complexType name=”ct0”>
 <complexContent mixed=”true”>
  <extension base=”st0”> 
   <attribute name=”a1” type=”st1” />
  </extension>
 <simpleContent>
</complexType>
class Ct0 extends IlrXmlObject
{
  [map(st0)] content;
}
class Ct1 extends Ct0
{
  [map(st1)] a1;
}