Schéma XSD pour valider un fichier XML

Le fichier XML

<?xml version="1.0" encoding="UTF-8"?>
<contacts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="contacts.xsd">

	<person>
		<avatar>avatars/avatar3.png</avatar>
		<firstname>Jane</firstname>
		<lastname>Doe</lastname>
		<email>jane.doe@example.com</email>
		<phone>0600000000</phone>
	</person>

	<person>
		<firstname>John</firstname>
		<lastname>Doe</lastname>
		<email>john.doe@example.com</email>
		<phone>0600000001</phone>
	</person>

	<person>
		<avatar>avatars/avatar1.png</avatar>
		<firstname>Sherlock</firstname>
		<lastname>Holmes</lastname>
		<email>sherlock.holmes@example.com</email>
		<phone>0600000002</phone>
	</person>

	<person>
		<avatar>avatars/avatar2.png</avatar>
		<firstname>Bruce</firstname>
		<lastname>Wayne</lastname>
		<email>bruce.wayne@example.com</email>
		<phone>0600000003</phone>
	</person>

	<person>
		<avatar>avatars/avatar4.png</avatar>
		<firstname>John</firstname>
		<lastname>Smith</lastname>
		<email>john.smith@example.com</email>
		<phone>0600000004</phone>
	</person>

</contacts>

Le schéma XSD

Pour valider le fichier XML on peut utiliser le schéma suivant (Russian Doll Design) :

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="contacts">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="person" minOccurs="0"
					maxOccurs="unbounded">
					<xs:complexType>
						<xs:sequence>
							<!-- Avatar est optionnel et n'apparait qu'une seule fois -->
							<xs:element name="avatar" minOccurs="0">
								<xs:simpleType>
									<xs:restriction base="xs:string">
										<!-- L'URL doit avoir le format avatars/avatar[nombre].png (Regex) -->
										<xs:pattern value="avatars\/avatar\d+\.png" />
									</xs:restriction>
								</xs:simpleType>
							</xs:element>
							<!-- firstname est requis et n'apparait qu'une seule fois -->
							<xs:element name="firstname">
								<xs:simpleType>
									<xs:restriction base="xs:string">
										<!-- Commence par une majuscule et se termine par un mot de 0 à 
											30 caractères (Regex) -->
										<xs:pattern value="[A-Z]\w{0,30}" />
									</xs:restriction>
								</xs:simpleType>
							</xs:element>
							<!-- lastname est requis et n'apparait qu'une seule fois -->
							<xs:element name="lastname">
								<xs:simpleType>
									<xs:restriction base="xs:string">
										<!-- Commence par une majuscule et se termine par un mot de 0 à 
											30 caractères (Regex) -->
										<xs:pattern value="[A-Z]\w{0,30}" />
									</xs:restriction>
								</xs:simpleType>
							</xs:element>
							<!-- email ou phone est requis (les deux peuvent être indiqués) -->
							<xs:choice>
								<xs:sequence>
									<xs:element name="email">
										<xs:simpleType>
											<xs:restriction base="xs:string">
												<!-- Valide le format d'un email (Regex) -->
												<xs:pattern
													value="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}" />
											</xs:restriction>
										</xs:simpleType>
									</xs:element>
									<xs:element name="phone" minOccurs="0">
										<xs:simpleType>
											<xs:restriction base="xs:string">
												<!-- Valide le format d'un numéro de téléphone commencant par 
													06 (Regex) -->
												<xs:pattern value="06[0-9]{8}" />
											</xs:restriction>
										</xs:simpleType>
									</xs:element>
								</xs:sequence>
								<xs:sequence>
									<xs:element name="email" minOccurs="0">
										<xs:simpleType>
											<xs:restriction base="xs:string">
												<!-- Valide le format d'un email (Regex) -->
												<xs:pattern
													value="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}" />
											</xs:restriction>
										</xs:simpleType>
									</xs:element>
									<xs:element name="phone">
										<xs:simpleType>
											<xs:restriction base="xs:string">
												<!-- Valide le format d'un numéro de téléphone commencant par 
													06 (Regex) -->
												<xs:pattern value="06[0-9]{8}" />
											</xs:restriction>
										</xs:simpleType>
									</xs:element>
								</xs:sequence>
							</xs:choice>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

L'élément contacts peut contenir aucun, un ou plusieurs éléments person

Chaque élément person doit contenir les éléments dans l'ordre.

Chaque élément est validé avec une expression régulière (les expressions sont des exemples pas forcément adéquats pour toutes les situations)

Il faut au moins un élément email ou phone (ou les deux).

Schéma dans Eclipse

Vous pouvez effectuer un clic droit sur votre fichier XML et validate pour valider le fichier XML. Vous pouvez consulter les schémas en cliquant sur l'onglet Design (en bas du fichier XSD ouvert)

Le schéma contacts

Le schéma contactsType

Le schéma personType

Commentaires