Chapter 13¶
Deriving complex types¶
Binding Test¶
Schema
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:annotation>
<xsd:documentation>
This example illustrates complex types that are derived from other specified types.
</xsd:documentation>
</xsd:annotation>
<xsd:element name="items" type="ItemsType"/>
<xsd:complexType name="ItemsType">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="hat" type="ProductType"/>
<xsd:element name="umbrella" type="RestrictedProductType"/>
<xsd:element name="shirt" type="ShirtType"/>
</xsd:choice>
</xsd:complexType>
<!--Empty Content Type-->
<xsd:complexType name="ItemType" abstract="true">
<xsd:attribute name="routingNum" type="xsd:integer"/>
</xsd:complexType>
<!--Empty Content Extension (with Attribute Extension)-->
<xsd:complexType name="ProductType">
<xsd:complexContent>
<xsd:extension base="ItemType">
<xsd:sequence>
<xsd:element name="number" type="xsd:integer"/>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="description" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="effDate" type="xsd:date"/>
<xsd:attribute name="lang" type="xsd:language"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<!--Complex Content Restriction-->
<xsd:complexType name="RestrictedProductType">
<xsd:complexContent>
<xsd:restriction base="ProductType">
<xsd:sequence>
<xsd:element name="number" type="xsd:integer"/>
<xsd:element name="name" type="xsd:token"/>
</xsd:sequence>
<xsd:attribute name="routingNum" type="xsd:short" use="required"/>
<xsd:attribute name="effDate" type="xsd:date" default="1900-01-01"/>
<xsd:attribute name="lang" use="prohibited"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<!--Complex Content Extension-->
<xsd:complexType name="ShirtType">
<xsd:complexContent>
<xsd:extension base="RestrictedProductType">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="size" type="SmallSizeType"/>
<xsd:element name="color" type="ColorType"/>
</xsd:choice>
<xsd:attribute name="sleeve" type="xsd:integer"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<!--Simple Content Extension-->
<xsd:complexType name="SizeType">
<xsd:simpleContent>
<xsd:extension base="xsd:integer">
<xsd:attribute name="system" type="xsd:token"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<!--Simple Content Restriction-->
<xsd:complexType name="SmallSizeType">
<xsd:simpleContent>
<xsd:restriction base="SizeType">
<xsd:minInclusive value="2"/>
<xsd:maxInclusive value="6"/>
<xsd:attribute name="system" type="xsd:token"
use="required"/>
</xsd:restriction>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="ColorType">
<xsd:attribute name="value" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
from dataclasses import dataclass, field
from typing import List, Optional
@dataclass
class ColorType:
"""
:ivar value:
"""
value: Optional[str] = field(
default=None,
metadata=dict(
type="Attribute"
)
)
@dataclass
class ItemType:
"""
:ivar routing_num:
"""
routing_num: Optional[int] = field(
default=None,
metadata=dict(
name="routingNum",
type="Attribute"
)
)
@dataclass
class RestrictedProductType:
"""
:ivar number:
:ivar name:
:ivar description:
:ivar routing_num:
:ivar lang:
:ivar eff_date:
"""
number: Optional[int] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True
)
)
name: Optional[str] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True
)
)
description: Optional[str] = field(
default=None,
metadata=dict(
type="Element",
namespace=""
)
)
routing_num: Optional[int] = field(
default=None,
metadata=dict(
name="routingNum",
type="Attribute",
required=True
)
)
lang: Optional[str] = field(
default=None,
metadata=dict(
type="Attribute"
)
)
eff_date: str = field(
default="1900-01-01",
metadata=dict(
name="effDate",
type="Attribute"
)
)
@dataclass
class SizeType:
"""
:ivar value:
:ivar system:
"""
value: Optional[int] = field(
default=None,
)
system: Optional[str] = field(
default=None,
metadata=dict(
type="Attribute"
)
)
@dataclass
class SmallSizeType:
"""
:ivar value:
:ivar system:
"""
value: Optional[int] = field(
default=None,
metadata=dict(
min_inclusive=2.0,
max_inclusive=6.0
)
)
system: Optional[str] = field(
default=None,
metadata=dict(
type="Attribute",
required=True
)
)
@dataclass
class ProductType(ItemType):
"""
:ivar number:
:ivar name:
:ivar description:
:ivar eff_date:
:ivar lang:
"""
number: Optional[int] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True
)
)
name: Optional[str] = field(
default=None,
metadata=dict(
type="Element",
namespace="",
required=True
)
)
description: Optional[str] = field(
default=None,
metadata=dict(
type="Element",
namespace=""
)
)
eff_date: Optional[str] = field(
default=None,
metadata=dict(
name="effDate",
type="Attribute"
)
)
lang: Optional[str] = field(
default=None,
metadata=dict(
type="Attribute"
)
)
@dataclass
class ShirtType(RestrictedProductType):
"""
:ivar size:
:ivar color:
:ivar sleeve:
"""
size: List[SmallSizeType] = field(
default_factory=list,
metadata=dict(
type="Element",
namespace="",
min_occurs=0,
max_occurs=9223372036854775807
)
)
color: List[ColorType] = field(
default_factory=list,
metadata=dict(
type="Element",
namespace="",
min_occurs=0,
max_occurs=9223372036854775807
)
)
sleeve: Optional[int] = field(
default=None,
metadata=dict(
type="Attribute"
)
)
@dataclass
class ItemsType:
"""
:ivar hat:
:ivar umbrella:
:ivar shirt:
"""
hat: List[ProductType] = field(
default_factory=list,
metadata=dict(
type="Element",
namespace="",
min_occurs=0,
max_occurs=9223372036854775807
)
)
umbrella: List[RestrictedProductType] = field(
default_factory=list,
metadata=dict(
type="Element",
namespace="",
min_occurs=0,
max_occurs=9223372036854775807
)
)
shirt: List[ShirtType] = field(
default_factory=list,
metadata=dict(
type="Element",
namespace="",
min_occurs=0,
max_occurs=9223372036854775807
)
)
@dataclass
class Items(ItemsType):
class Meta:
name = "items"
XML Document
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="chapter14.xsd">
<hat routingNum="123456" effDate="2002-04-02" lang="en-US">
<number>557</number>
<name>Ten-Gallon Hat</name>
<description>This is a great hat!</description>
</hat>
<umbrella routingNum="123" effDate="2002-04-02">
<number>557</number>
<name>Ten-Gallon Hat</name>
</umbrella>
<shirt routingNum="124" effDate="2002-04-02" sleeve="17">
<number>557</number>
<name>Short-Sleeved Linen Blouse</name>
<color value="blue"/>
<size system="US-DRESS">6</size>
</shirt>
</items>
xsData XML Document
<items>
<hat routingNum="123456" effDate="2002-04-02" lang="en-US">
<number>557</number>
<name>Ten-Gallon Hat</name>
<description>This is a great hat!</description>
</hat>
<umbrella routingNum="123" effDate="2002-04-02">
<number>557</number>
<name>Ten-Gallon Hat</name>
</umbrella>
<shirt routingNum="124" effDate="2002-04-02" sleeve="17">
<number>557</number>
<name>Short-Sleeved Linen Blouse</name>
<size system="US-DRESS">6</size>
<color value="blue"/>
</shirt>
</items>
xsData JSON
{
"hat": [
{
"routing_num": 123456,
"number": 557,
"name": "Ten-Gallon Hat",
"description": "This is a great hat!",
"eff_date": "2002-04-02",
"lang": "en-US"
}
],
"umbrella": [
{
"number": 557,
"name": "Ten-Gallon Hat",
"description": null,
"routing_num": 123,
"lang": null,
"eff_date": "2002-04-02"
}
],
"shirt": [
{
"number": 557,
"name": "Short-Sleeved Linen Blouse",
"description": null,
"routing_num": 124,
"lang": null,
"eff_date": "2002-04-02",
"size": [
{
"value": 6,
"system": "US-DRESS"
}
],
"color": [
{
"value": "blue"
}
],
"sleeve": 17
}
]
}
Samples Source
Definitive XML Schema by Priscilla Walmsley (c) 2012 Prentice Hall PTR