<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- The only two possible root elements are methodResponse and methodCall so these are the only two I use a top-level declaration for. --> <xsd:element name="methodCall"> <xsd:complexType> <xsd:all> <xsd:element name="methodName"> <xsd:simpleType> <xsd:restriction base="ASCIIString"> <xsd:pattern value="([A-Za-z0-9]|/|\.|:|_)*" /> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="params" minOccurs="0" maxOccurs="1"> <xsd:complexType> <xsd:sequence> <xsd:element name="param" type="ParamType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:all> </xsd:complexType> </xsd:element> <xsd:element name="methodResponse"> <xsd:complexType> <xsd:choice> <xsd:element name="params"> <xsd:complexType> <xsd:sequence> <xsd:element name="param" type="ParamType"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="fault"> <!-- What can appear inside a fault is very restricted --> <xsd:complexType> <xsd:sequence> <xsd:element name="value"> <xsd:complexType> <xsd:sequence> <xsd:element name="struct"> <xsd:complexType> <xsd:sequence> <xsd:element name="member" type="MemberType"> </xsd:element> <xsd:element name="member" type="MemberType"> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:choice> </xsd:complexType> </xsd:element> <xsd:complexType name="ParamType"> <xsd:sequence> <xsd:element name="value" type="ValueType"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="ValueType" mixed="true"> <!-- I need to figure out how to say that this is either a simple xsd:string type or that it contains one of these elements; but that otherwise it does not have mixed content --> <xsd:choice> <xsd:element name="i4" type="xsd:int"/> <xsd:element name="int" type="xsd:int"/> <xsd:element name="string" type="ASCIIString"/> <xsd:element name="double" type="xsd:decimal"/> <xsd:element name="Base64" type="xsd:base64Binary"/> <xsd:element name="boolean" type="NumericBoolean"/> <xsd:element name="dateTime.iso8601" type="xsd:dateTime"/> <xsd:element name="array" type="ArrayType"/> <xsd:element name="struct" type="StructType"/> </xsd:choice> </xsd:complexType> <xsd:complexType name="StructType"> <xsd:sequence> <xsd:element name="member" type="MemberType" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="MemberType"> <xsd:sequence> <xsd:element name="name" type="xsd:string" /> <xsd:element name="value" type="ValueType"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="ArrayType"> <xsd:sequence> <xsd:element name="data"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="ValueType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="ASCIIString"> <xsd:restriction base="xsd:string"> <xsd:pattern value="([ -~]|\n|\r|\t)*" /> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="NumericBoolean"> <xsd:restriction base="xsd:boolean"> <xsd:pattern value="0|1" /> </xsd:restriction> </xsd:simpleType> </xsd:schema>