This is roughly what the XML schema should looks like
<xs:element name="MetaDataAttribute" type="MetaDataAttribute"/>
<xs:complexType name="MetaDataAttribute">
<xs:sequence>
<xs:element name="CustomField" type="xs:boolean" minOccurs="1" maxOccurs="1"/>
<xs:element name="DataType" type="rng:DataTypeEnum" minOccurs="1" maxOccurs="1"/>
<xs:element name="Deprecated" type="xs:boolean" minOccurs="1" maxOccurs="1"/>
<xs:element name="Description" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="KeyType" type="MetaDataKeyTypeEnum" minOccurs="1" maxOccurs="1"/>
<xs:element name="ListType" type="MetaDataListTypeEnum" minOccurs="1" maxOccurs="1"/>
<xs:element name="MaxLength" type="xs:int" minOccurs="1" maxOccurs="1"/>
<xs:element name="MaxListSize" type="xs:int" minOccurs="1" maxOccurs="1"/>
<xs:element name="MaxValue" type="xs:int" minOccurs="1" maxOccurs="1"/>
<xs:element name="MinValue" type="xs:int" minOccurs="1" maxOccurs="1"/>
<xs:element name="Name" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="Nullable" type="xs:boolean" minOccurs="1" maxOccurs="1"/>
<xs:element name="Pattern" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="UsageOnCreate" type="MetaDataUsageEnum" minOccurs="1" maxOccurs="1"/>
<xs:element name="UsageOnDestroy" type="MetaDataUsageEnum" minOccurs="1" maxOccurs="1"/>
<xs:element name="UsageOnGet" type="MetaDataUsageEnum" minOccurs="1" maxOccurs="1"/>
<xs:element name="UsageOnUpdate" type="MetaDataUsageEnum" minOccurs="1" maxOccurs="1"/>
<xs:element name="UsedAsName" type="xs:boolean" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:element name="MetaDataClass" type="MetaDataClass"/>
<xs:complexType name="MetaDataClass">
<xs:sequence>
<xs:element name="Attributes" type="MetaDataAttribute" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="CanCreate" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
<xs:element name="CanDestroy" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
<xs:element name="CanGet" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
<xs:element name="CanUpdate" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
<xs:element name="Class" type="rng:RNObjectType" minOccurs="0" maxOccurs="1"/>
<xs:element name="DerivedFrom" type="rng:RNObjectType" minOccurs="0" maxOccurs="1"/>
<xs:element name="Relationships" type="MetaDataRelationship" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="MetaDataUsageEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="NOT_ALLOWED"/>
<xs:enumeration value="ALLOWED"/>
<xs:enumeration value="IGNORED"/>
<xs:enumeration value="REQUIRED"/>
</xs:restriction>
</xs:simpleType>
I have also included the Usage enum. It relates directly to the CRUD operations in the WSDL. So if UsageOnCreate is REQUIRED, this means the field is required on the create operation and the server will throw a soap fault if it is not set.
We will also want to drive a significant amount of testing based off of the Relationships data. The MetaDataRelationship complexType basically describes a relationship between the current class and another class. I figured I did not need to specify the details for this since whatever we do for the CRUD operations would likely apply to the other testing.
The meta-data is based on a CSV file that is checked into source control. So we have the option of using the CSV file or using the meta-data at runtime.
Another design option we were considering was to write a simple app (maybe in C#/.NET) that would take the meta-data (either from the CSV or runtime) and emit a bunch of data source files that could be used in data source loop steps. Would this be a better design? It seems like it would be easier to maintain and easier to track changes since we could source control the data source files.