<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" targetNamespace="http://cme.mitre.org/XMLSchema/cme" version="1.0" xmlns:cme="http://cme.mitre.org/XMLSchema/cme">
	<xs:element name="CMEData">
		<xs:annotation>
			<xs:documentation>The CMEData element serves as the root element of the docuemt.</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element name="CME" type="cme:CMEType" minOccurs="0" maxOccurs="unbounded"/>
				<xs:element name="Taxon" type="cme:TaxonType" minOccurs="0" maxOccurs="unbounded"/>
				<xs:element name="Sample" type="cme:SampleType" minOccurs="0" maxOccurs="unbounded"/>
			</xs:sequence>
			<xs:attribute name="dateCreated" use="required" type="xs:dateTime"/>
		</xs:complexType>
	</xs:element>
	<!-- CMEType defininition -->
	<xs:complexType name="CMEType">
		<xs:annotation>
			<xs:documentation>The CMEType defines the structure for CME Id related metadata.</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="DateAssigned" type="xs:dateTime" minOccurs="1" maxOccurs="1"/>
			<xs:element name="Description" type="xs:string" minOccurs="1" maxOccurs="1"/>
			<xs:element name="Aliases" type="cme:AliasesType" minOccurs="1" maxOccurs="1"/>
			<xs:element name="Instances" type="cme:InstancesType" minOccurs="0" maxOccurs="1"/>
		</xs:sequence>
		<xs:attribute name="id" type="cme:CMEIdType" use="required"/>
	</xs:complexType>
	<!-- AliasesType defininition -->
	<xs:complexType name="AliasesType">
		<xs:annotation>
			<xs:documentation>The AliasesType defines the structure for representing a series of malware alieses.</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="Alias" type="cme:AliasType" minOccurs="1" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<!-- AliasType defininition -->
	<xs:complexType name="AliasType">
		<xs:annotation>
			<xs:documentation>The AliasType defines the structure for representing a malware alies.</xs:documentation>
		</xs:annotation>
		<xs:simpleContent>
			<xs:extension base="xs:string">
				<xs:attribute name="source" type="xs:string" use="required"/>
				<xs:attribute name="url" type="xs:anyURI" use="optional"/>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
	<!-- CMEIdType definition -->
	<xs:simpleType name="CMEIdType">
		<xs:annotation>
			<xs:documentation>Define the format for acceptable CME ids.</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:pattern value="CME-[1-9][0-9]*"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- InsatancesType declaration -->
	<xs:complexType name="InstancesType">
		<xs:annotation>
			<xs:documentation>The InsatancesType defines the structure for representing a series of instances of a unit of malware.</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="Instance" type="cme:SampleIdType" minOccurs="1" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<!-- TaxonType defininition -->
	<xs:complexType name="TaxonType">
		<xs:annotation>
			<xs:documentation>The TaxonType defines the structure for taxon related metadata.</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="DateAssigned" type="xs:dateTime" minOccurs="1" maxOccurs="1"/>
			<xs:element name="Description" type="xs:string" minOccurs="1" maxOccurs="1"/>
			<xs:element name="Members" type="cme:MembersType" minOccurs="1" maxOccurs="1"/>
		</xs:sequence>
		<xs:attribute name="id" type="cme:TaxonIdType" use="required"/>
		<xs:attribute name="rank" type="cme:RankEnumType" use="required"/>
	</xs:complexType>
	<!-- TaxonIdType definition -->
	<xs:simpleType name="TaxonIdType">
		<xs:annotation>
			<xs:documentation>Define the format for acceptable taxon ids.</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:pattern value="CME:[A-Za-z]+"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- RankEnumType definition -->
	<xs:simpleType name="RankEnumType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Kingdom" />
			<xs:enumeration value="Phylum" />
			<xs:enumeration value="Class" />
			<xs:enumeration value="Order" />
			<xs:enumeration value="Family" />
			<xs:enumeration value="Genus" />
			<xs:enumeration value="Species" />
		</xs:restriction>
	</xs:simpleType>		
	<!-- MambersType declaration -->
	<xs:complexType name="MembersType">
		<xs:annotation>
			<xs:documentation>The InsatancesType defines the structure for representing a series of instances of a unit of malware.</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="Member" type="cme:CMEIdType" minOccurs="1" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>	
	<!-- SampleType defininition -->
	<xs:complexType name="SampleType">
		<xs:annotation>
			<xs:documentation>The SampleType defines the structure for sample related metadata.</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="DateRecieved" type="xs:dateTime" minOccurs="1" maxOccurs="1"/>
			<xs:element name="Description" type="xs:string" minOccurs="1" maxOccurs="1"/>
			<xs:element name="Source" type="xs:string" minOccurs="1" maxOccurs="1"/>
			<xs:element name="md5" type="cme:md5Type" minOccurs="1" maxOccurs="1"/>
			<xs:element name="DetectedAs" type="cme:DetectedAsType" minOccurs="1" maxOccurs="1"/>
		</xs:sequence>
		<xs:attribute name="id" type="cme:SampleIdType" use="required"/>
	</xs:complexType>
	<!-- SampleIdType definition -->
	<xs:simpleType name="SampleIdType">
		<xs:annotation>
			<xs:documentation>The SampleIdType defines the structure for representing a malware alies.</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:pattern value="[A-Za-z]+:[1-9][0-9]*-[1-9][0-9]*"/>
		</xs:restriction>
	</xs:simpleType>		
	<!-- DetectedAsType declaration -->
	<xs:complexType name="DetectedAsType">
		<xs:annotation>
			<xs:documentation>The InsatancesType defines the structure for representing a series of instances of a unit of malware.</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="Alias" type="cme:DetectedAliasType" minOccurs="1" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<!-- DetectedAliasType defininition -->
	<xs:complexType name="DetectedAliasType">
		<xs:annotation>
			<xs:documentation>The AliasType defines the structure for representing a malware alies.</xs:documentation>
		</xs:annotation>
		<xs:simpleContent>
			<xs:extension base="cme:AliasType">
				<xs:attribute name="date" type="xs:dateTime" use="required"/>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
	<!-- md5Type defininition -->
	<xs:complexType name="md5Type">
		<xs:annotation>
			<xs:documentation>The md5Type defines the structure for representing md5 infomation.</xs:documentation>
		</xs:annotation>
		<xs:simpleContent>
			<xs:extension base="xs:string">
				<xs:attribute name="component" type="xs:string" use="required"/>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>	
</xs:schema>
