# Appendix C - XML Schema

This appendix provides the XML schema that is used for the XML files produced by `mxmldoc`. This schema is available on-line at:

        https://michaelrsweet.github.io/mxml/mxmldoc.xsd

## mxmldoc.xsd

    <?xml version="1.0"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:annotation>
        <xsd:documentation xml:lang="en">
          Mini-XML 2.11 documentation schema for mxmldoc output.
          Copyright 2003-2017 by Michael R Sweet.
        </xsd:documentation>
      </xsd:annotation>

      <!-- basic element definitions -->
      <xsd:element name="argument" type="argumentType"/>
      <xsd:element name="class" type="classType"/>
      <xsd:element name="constant" type="constantType"/>
      <xsd:element name="description" type="xsd:string"/>
      <xsd:element name="enumeration" type="enumerationType"/>
      <xsd:element name="function" type="functionType"/>
      <xsd:element name="mxmldoc" type="mxmldocType"/>
      <xsd:element name="namespace" type="namespaceType"/>
      <xsd:element name="returnvalue" type="returnvalueType"/>
      <xsd:element name="seealso" type="identifierList"/>
      <xsd:element name="struct" type="structType"/>
      <xsd:element name="typedef" type="typedefType"/>
      <xsd:element name="type" type="xsd:string"/>
      <xsd:element name="union" type="unionType"/>
      <xsd:element name="variable" type="variableType"/>

      <!-- descriptions of complex elements -->
      <xsd:complexType name="argumentType">
        <xsd:sequence>
          <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
          <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
        <xsd:attribute name="default" type="xsd:string" use="optional"/>
        <xsd:attribute name="name" type="identifier" use="required"/>
        <xsd:attribute name="direction" type="direction" use="optional"
         default="I"/>
      </xsd:complexType>

      <xsd:complexType name="classType">
        <xsd:sequence>
          <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          <xsd:choice minOccurs="0" maxOccurs="unbounded">
    	<xsd:element ref="class"/>
    	<xsd:element ref="enumeration"/>
    	<xsd:element ref="function"/>
    	<xsd:element ref="struct"/>
    	<xsd:element ref="typedef"/>
    	<xsd:element ref="union"/>
    	<xsd:element ref="variable"/>
          </xsd:choice>
        </xsd:sequence>
        <xsd:attribute name="name" type="identifier" use="required"/>
        <xsd:attribute name="parent" type="xsd:string" use="optional"/>
      </xsd:complexType>

      <xsd:complexType name="constantType">
        <xsd:sequence>
          <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="identifier" use="required"/>
      </xsd:complexType>

      <xsd:complexType name="enumerationType">
        <xsd:sequence>
          <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          <xsd:element ref="constant" minOccurs="1" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="identifier" use="required"/>
      </xsd:complexType>

      <xsd:complexType name="functionType">
        <xsd:sequence>
          <xsd:element ref="returnvalue" minOccurs="0" maxOccurs="1"/>
          <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          <xsd:element ref="argument" minOccurs="1" maxOccurs="unbounded"/>
          <xsd:element ref="seealso" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="identifier" use="required"/>
        <xsd:attribute name="scope" type="scope" use="optional"/>
      </xsd:complexType>

      <xsd:complexType name="mxmldocType">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element ref="class"/>
          <xsd:element ref="enumeration"/>
          <xsd:element ref="function"/>
          <xsd:element ref="namespace"/>
          <xsd:element ref="struct"/>
          <xsd:element ref="typedef"/>
          <xsd:element ref="union"/>
          <xsd:element ref="variable"/>
        </xsd:choice>
      </xsd:complexType>

      <xsd:complexType name="namespaceType">
        <xsd:sequence>
          <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          <xsd:choice minOccurs="0" maxOccurs="unbounded">
    	<xsd:element ref="class"/>
    	<xsd:element ref="enumeration"/>
    	<xsd:element ref="function"/>
    	<xsd:element ref="struct"/>
    	<xsd:element ref="typedef"/>
    	<xsd:element ref="union"/>
    	<xsd:element ref="variable"/>
          </xsd:choice>
        </xsd:sequence>
        <xsd:attribute name="name" type="identifier" use="required"/>
      </xsd:complexType>

      <xsd:complexType name="returnvalueType">
        <xsd:sequence>
          <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
          <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
      </xsd:complexType>

      <xsd:complexType name="structType">
        <xsd:sequence>
          <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          <xsd:choice minOccurs="0" maxOccurs="unbounded">
    	<xsd:element ref="variable"/>
    	<xsd:element ref="function"/>
          </xsd:choice>
        </xsd:sequence>
        <xsd:attribute name="name" type="identifier" use="required"/>
      </xsd:complexType>

      <xsd:complexType name="typedefType">
        <xsd:sequence>
          <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
          <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="identifier" use="required"/>
      </xsd:complexType>

      <xsd:complexType name="unionType">
        <xsd:sequence>
          <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          <xsd:element ref="variable" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="identifier" use="required"/>
      </xsd:complexType>

      <xsd:complexType name="variableType">
        <xsd:sequence>
          <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
          <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="identifier" use="required"/>
      </xsd:complexType>

      <!-- data types -->
      <xsd:simpleType name="direction">
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="I"/>
          <xsd:enumeration value="O"/>
          <xsd:enumeration value="IO"/>
        </xsd:restriction>
      </xsd:simpleType>

      <xsd:simpleType name="identifier">
        <xsd:restriction base="xsd:string">
          <xsd:pattern value="[a-zA-Z_(.]([a-zA-Z_(.,)* 0-9])*"/>
        </xsd:restriction>
      </xsd:simpleType>

      <xsd:simpleType name="identifierList">
        <xsd:list itemType="identifier"/>
      </xsd:simpleType>

      <xsd:simpleType name="scope">
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value=""/>
          <xsd:enumeration value="private"/>
          <xsd:enumeration value="protected"/>
          <xsd:enumeration value="public"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:schema>