XML and XSD - use element name as replacement of xsi:type for polymorphism
Posted
by disown
on Stack Overflow
See other posts from Stack Overflow
or by disown
Published on 2010-06-01T14:21:55Z
Indexed on
2010/06/01
14:23 UTC
Read the original article
Hit count: 247
Taking the W3C vehicle XSD as an example:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://cars.example.com/schema"
xmlns:target="http://cars.example.com/schema">
<complexType name="Vehicle" abstract="true"/>
<complexType name="Car">
<complexContent>
<extension base="target:Vehicle"/>
...
</complexContent>
</complexType>
<complexType name="Plane">
<complexContent>
<extension base="target:Vehicle"/>
<sequence>
<element name="wingspan" type="integer"/>
</sequence>
</complexContent>
</complexType>
</schema>
, and the following definition of 'meansOfTravel':
<complexType name="MeansOfTravel">
<complexContent>
<sequence>
<element name="transport" type="target:Vehicle"/>
</sequence>
</complexContent>
</complexType>
<element name="meansOfTravel" type="target:MeansOfTravel"/>
With this definition you need to specify the type of your instance using xsi:type, like this:
<meansOfTravel>
<transport xsi:type="Plane">
<wingspan>3</wingspan>
</transport>
</meansOfTravel>
I would just like to acheive a 'name of type' - 'name of element' mapping so that this could be replaced with just
<meansOfTravel>
<plane>
<wingspan>3</wingspan>
</plane>
</meansOfTravel>
The only way I could do this until now is by making it explicit:
<complexType name="MeansOfTravel">
<sequence>
<choice>
<element name="plane" type="target:Plane"/>
<element name="car" type="target:Car"/>
</choice>
</sequence>
</complexType>
<element name="meansOfTravel" type="target:MeansOfTravel"/>
But this means that I have to list all possible sub-types in the 'MeansOfTravel' complex type. Is there no way of making the XML parser assume that you mean a 'Plane' if you call the element 'plane'? Or do I have to make the choice explicit? I would just like to keep my design DRY - if you have any other suggestions (like groups or so) - i would love to hear them.
© Stack Overflow or respective owner