Chapter 10

Union and list types

Binding Test

Schema

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <xsd:annotation>
    <xsd:documentation>
      This example illustrates list and union types.
    </xsd:documentation>
  </xsd:annotation>

  <xsd:element name="sizes" type="SizesType"/>

  <xsd:complexType name="SizesType">
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="size" type="SizeType"/>
      <xsd:element name="smallSize" type="SmallSizeType"/>
      <xsd:element name="internationalSize" type="InternationalSizeType"/>
      <xsd:element name="availableSizes" type="AvailableSizesType"/>
      <xsd:element name="applicableSizes" type="ApplicableSizesType"/>
    </xsd:choice>
  </xsd:complexType>

  <xsd:simpleType name="SizeType">
    <xsd:union memberTypes="DressSizeType">
      <xsd:simpleType>
        <xsd:restriction base="xsd:token">
          <xsd:enumeration value="small"/>
          <xsd:enumeration value="medium"/>
          <xsd:enumeration value="large"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:union>
  </xsd:simpleType>

  <xsd:simpleType name="DressSizeType">
    <xsd:restriction base="xsd:integer">
      <xsd:minInclusive value="2"/>
      <xsd:maxInclusive value="18"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="SmallSizeType">
    <xsd:restriction base="SizeType">
      <xsd:enumeration value="2"/>
      <xsd:enumeration value="4"/>
      <xsd:enumeration value="6"/>
      <xsd:enumeration value="small"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="InternationalSizeType">
    <xsd:union memberTypes="SizeType">
      <xsd:simpleType>
        <xsd:restriction base="xsd:integer">
          <xsd:minInclusive value="24"/>
          <xsd:maxInclusive value="54"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:union>
  </xsd:simpleType>

  <xsd:simpleType name="AvailableSizesType">
    <xsd:list itemType="SizeType"/>
  </xsd:simpleType>

  <xsd:simpleType name="ApplicableSizesType">
    <xsd:restriction>
      <xsd:simpleType>
        <xsd:list itemType="SizeType"/>
      </xsd:simpleType>
      <xsd:enumeration value="small medium large"/>
      <xsd:enumeration value="2 4 6 8 10 12 14 16 18"/>
    </xsd:restriction>
  </xsd:simpleType>

</xsd:schema>
from enum import Enum
from dataclasses import dataclass, field
from typing import List, Union


class SmallSizeType(Enum):
    """
    :cvar VALUE_2:
    :cvar VALUE_4:
    :cvar VALUE_6:
    :cvar SMALL:
    """
    VALUE_2 = "2"
    VALUE_4 = "4"
    VALUE_6 = "6"
    SMALL = "small"


@dataclass
class SizesType:
    """
    :ivar size:
    :ivar small_size:
    :ivar international_size:
    :ivar available_sizes:
    :ivar applicable_sizes:
    """
    size: List[Union[int, "SizesType.Value"]] = field(
        default_factory=list,
        metadata=dict(
            type="Element",
            namespace="",
            min_occurs=0,
            max_occurs=9223372036854775807,
            min_inclusive=2.0,
            max_inclusive=18.0
        )
    )
    small_size: List[SmallSizeType] = field(
        default_factory=list,
        metadata=dict(
            name="smallSize",
            type="Element",
            namespace="",
            min_occurs=0,
            max_occurs=9223372036854775807
        )
    )
    international_size: List[Union[int, "SizesType.Value"]] = field(
        default_factory=list,
        metadata=dict(
            name="internationalSize",
            type="Element",
            namespace="",
            min_occurs=0,
            max_occurs=9223372036854775807,
            min_inclusive=24.0,
            max_inclusive=54.0
        )
    )
    available_sizes: List[Union[int, "SizesType.Value"]] = field(
        default_factory=list,
        metadata=dict(
            name="availableSizes",
            type="Element",
            namespace="",
            min_occurs=0,
            max_occurs=9223372036854775807,
            min_inclusive=2.0,
            max_inclusive=18.0
        )
    )
    applicable_sizes: List[Union[int, "SizesType.Value"]] = field(
        default_factory=list,
        metadata=dict(
            name="applicableSizes",
            type="Element",
            namespace="",
            min_occurs=0,
            max_occurs=9223372036854775807,
            min_inclusive=2.0,
            max_inclusive=18.0
        )
    )

    class Value(Enum):
        """
        :cvar SMALL:
        :cvar MEDIUM:
        :cvar LARGE:
        """
        SMALL = "small"
        MEDIUM = "medium"
        LARGE = "large"


@dataclass
class Sizes(SizesType):
    class Meta:
        name = "sizes"

XML Document

<sizes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="chapter11.xsd">
  <size>12</size>
  <size>medium</size>
  <smallSize>6</smallSize>
  <smallSize>small</smallSize>
  <internationalSize>12</internationalSize>
  <internationalSize>24</internationalSize>
  <internationalSize>large</internationalSize>
  <availableSizes>10 large 2</availableSizes>
  <applicableSizes>small medium large</applicableSizes>
</sizes>

xsData XML Document

<sizes>
  <size>12</size>
  <size>medium</size>
  <smallSize>6</smallSize>
  <smallSize>small</smallSize>
  <internationalSize>12</internationalSize>
  <internationalSize>24</internationalSize>
  <internationalSize>large</internationalSize>
  <availableSizes>10 large 2</availableSizes>
  <applicableSizes>small medium large</applicableSizes>
</sizes>

xsData JSON

{
    "size": [
        12,
        "medium"
    ],
    "small_size": [
        "6",
        "small"
    ],
    "international_size": [
        12,
        24,
        "large"
    ],
    "available_sizes": [
        "10 large 2"
    ],
    "applicable_sizes": [
        "small medium large"
    ]
}

Samples Source

Definitive XML Schema by Priscilla Walmsley (c) 2012 Prentice Hall PTR