Chapter 08

Simple types

Binding Test

Schema

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

  <xsd:annotation>
    <xsd:documentation>
      This example illustrates various simple type restrictions using bounds facets,
      patterns, and enumerations. White space is used in the instance to illustrate
      that white space processing takes place before validation.
    </xsd:documentation>
  </xsd:annotation>


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

  <xsd:complexType name="SizesType">
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="dressSize" type="DressSizeType"/>
      <xsd:element name="mediumDressSize" type="MediumDressSizeType"/>
      <xsd:element name="smallDressSize" type="SmallDressSizeType"/>
      <xsd:element name="smlxSize" type="SMLXSizeType"/>
      <xsd:element name="xsmlxSize" type="XSMLXSizeType"/>
    </xsd:choice>
  </xsd:complexType>

  <xsd:simpleType name="DressSizeType">
    <xsd:restriction base="xsd:integer">
      <xsd:minInclusive value="2"/>
      <xsd:maxInclusive value="18"/>
      <xsd:pattern value="\d{1,2}"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="MediumDressSizeType">
    <xsd:restriction base="DressSizeType">
      <xsd:minInclusive value="8"/>
      <xsd:maxInclusive value="12"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="SmallDressSizeType">
    <xsd:restriction base="DressSizeType">
      <xsd:minInclusive value="2"/>
      <xsd:maxInclusive value="6"/>
      <xsd:pattern value="\d{1}"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="SMLXSizeType">
    <xsd:restriction base="xsd:token">
      <xsd:enumeration value="small"/>
      <xsd:enumeration value="medium"/>
      <xsd:enumeration value="large"/>
      <xsd:enumeration value="extra large"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="XSMLXSizeType">
    <xsd:union memberTypes="SMLXSizeType">
      <xsd:simpleType>
        <xsd:restriction base="xsd:token">
          <xsd:enumeration value="extra small"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:union>
  </xsd:simpleType>

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


class SmlxsizeType(Enum):
    """
    :cvar SMALL:
    :cvar MEDIUM:
    :cvar LARGE:
    :cvar EXTRA_LARGE:
    """
    SMALL = "small"
    MEDIUM = "medium"
    LARGE = "large"
    EXTRA_LARGE = "extra large"


class XsmlxsizeType(Enum):
    """
    :cvar SMALL:
    :cvar MEDIUM:
    :cvar LARGE:
    :cvar EXTRA_LARGE:
    :cvar EXTRA_SMALL:
    """
    SMALL = "small"
    MEDIUM = "medium"
    LARGE = "large"
    EXTRA_LARGE = "extra large"
    EXTRA_SMALL = "extra small"


@dataclass
class SizesType:
    """
    :ivar dress_size:
    :ivar medium_dress_size:
    :ivar small_dress_size:
    :ivar smlx_size:
    :ivar xsmlx_size:
    """
    dress_size: List[str] = field(
        default_factory=list,
        metadata=dict(
            name="dressSize",
            type="Element",
            namespace="",
            min_occurs=0,
            max_occurs=9223372036854775807,
            min_inclusive=2.0,
            max_inclusive=18.0,
            pattern=r"\d{1,2}"
        )
    )
    medium_dress_size: List[str] = field(
        default_factory=list,
        metadata=dict(
            name="mediumDressSize",
            type="Element",
            namespace="",
            min_occurs=0,
            max_occurs=9223372036854775807,
            min_inclusive=8.0,
            max_inclusive=12.0,
            pattern=r"\d{1,2}"
        )
    )
    small_dress_size: List[str] = field(
        default_factory=list,
        metadata=dict(
            name="smallDressSize",
            type="Element",
            namespace="",
            min_occurs=0,
            max_occurs=9223372036854775807,
            min_inclusive=2.0,
            max_inclusive=6.0,
            pattern=r"\d{1}"
        )
    )
    smlx_size: List[SmlxsizeType] = field(
        default_factory=list,
        metadata=dict(
            name="smlxSize",
            type="Element",
            namespace="",
            min_occurs=0,
            max_occurs=9223372036854775807
        )
    )
    xsmlx_size: List[XsmlxsizeType] = field(
        default_factory=list,
        metadata=dict(
            name="xsmlxSize",
            type="Element",
            namespace="",
            min_occurs=0,
            max_occurs=9223372036854775807
        )
    )


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

XML Document

<sizes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="chapter09.xsd">
  <dressSize>06</dressSize>
  <mediumDressSize>12</mediumDressSize>
  <smallDressSize>6</smallDressSize>
  <smlxSize>extra
  large</smlxSize>
  <xsmlxSize>extra    small</xsmlxSize>
</sizes>

xsData XML Document

<sizes>
  <dressSize>06</dressSize>
  <mediumDressSize>12</mediumDressSize>
  <smallDressSize>6</smallDressSize>
  <smlxSize>extra
  large</smlxSize>
  <xsmlxSize>extra    small</xsmlxSize>
</sizes>

xsData JSON

{
    "dress_size": [
        "06"
    ],
    "medium_dress_size": [
        "12"
    ],
    "small_dress_size": [
        "6"
    ],
    "smlx_size": [
        "extra\n  large"
    ],
    "xsmlx_size": [
        "extra    small"
    ]
}

Samples Source

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