XSD - Guide rapide

La définition de schéma XML, communément appelée XSD, est un moyen de décrire précisément le langage XML. XSD vérifie la validité de la structure et du vocabulaire d'un document XML par rapport aux règles grammaticales du langage XML approprié.

Un document XML peut être défini comme -

  • Well-formed- Si le document XML adhère à toutes les règles XML générales telles que les balises doivent être correctement imbriquées, les balises d'ouverture et de fermeture doivent être équilibrées et les balises vides doivent se terminer par '/>', alors il est appelé comme étant bien formé .

    OR

  • Valid- Un document XML dit valide lorsqu'il est non seulement bien formé , mais il est également conforme au XSD disponible qui spécifie les balises qu'il utilise, les attributs que ces balises peuvent contenir et les balises pouvant apparaître à l'intérieur d'autres balises, entre autres propriétés .

Le diagramme suivant montre comment XSD est utilisé pour structurer des documents XML -

Voici un simple code XSD. Jetez un coup d'oeil.

<?xml version = "1.0"?>

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
   targetNamespace = "http://www.tutorialspoint.com" 
   xmlns = "http://www.tutorialspoint.com"
   elementFormDefault = "qualified">

   <xs:element name = 'class'>
      <xs:complexType>
         <xs:sequence>
            <xs:element name = 'student' type = 'StudentType' minOccurs = '0' 
               maxOccurs = 'unbounded' />
         </xs:sequence>
      </xs:complexType>
   </xs:element>

   <xs:complexType name = "StudentType">
      <xs:sequence>
         <xs:element name = "firstname" type = "xs:string"/>
         <xs:element name = "lastname" type = "xs:string"/>
         <xs:element name = "nickname" type = "xs:string"/>
         <xs:element name = "marks" type = "xs:positiveInteger"/>
      </xs:sequence>
      <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
   </xs:complexType>
   
</xs:schema>

traits

Voici une liste de certaines des fonctionnalités populaires de XSD -

  • Les XSD peuvent être extensibles pour de futurs ajouts.
  • XSD est plus riche et plus puissant que DTD.
  • XSD est écrit en XML.
  • XSD prend en charge les types de données.
  • XSD prend en charge les espaces de noms.
  • XSD est la recommandation du W3C.

Un XSD XML est conservé dans un document séparé, puis le document peut être lié à un document XML pour l'utiliser.

Syntaxe

La syntaxe de base d'un XSD est la suivante -

<?xml version = "1.0"?>

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
   targetNamespace = "http://www.tutorialspoint.com"
   xmlns = "http://www.tutorialspoint.com" elementFormDefault = "qualified">
   
   <xs:element name = 'class'>
      <xs:complexType>
         <xs:sequence>
            <xs:element name = 'student' type = 'StudentType' minOccurs = '0' 
               maxOccurs = 'unbounded' />
         </xs:sequence>
      </xs:complexType>
   </xs:element>

   <xs:complexType name = "StudentType">
      <xs:sequence>
         <xs:element name = "firstname" type = "xs:string"/>
         <xs:element name = "lastname" type = "xs:string"/>
         <xs:element name = "nickname" type = "xs:string"/>
         <xs:element name = "marks" type = "xs:positiveInteger"/>
      </xs:sequence>
      <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
   </xs:complexType>
   
</xs:schema>

Élément <Schema>

Le schéma est l'élément racine de XSD et il est toujours requis.

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">

Le fragment ci-dessus spécifie que les éléments et les types de données utilisés dans le schéma sont définis dans http://www.w3.org/2001/XMLSchema namespace et ces éléments / types de données doivent être préfixés par xs. C'est toujours nécessaire.

targetNamespace = "http://www.tutorialspoint.com"

Le fragment ci-dessus spécifie que les éléments utilisés dans ce schéma sont définis dans http://www.tutorialspoint.comespace de noms. C'est facultatif.

xmlns = "http://www.tutorialspoint.com"

Le fragment ci-dessus spécifie que l'espace de noms par défaut est http://www.tutorialspoint.com.

elementFormDefault = "qualified"

Le fragment ci-dessus indique que tous les éléments déclarés dans ce schéma doivent être qualifiés d'espace de noms avant de les utiliser dans un document XML. Il est facultatif.

Schéma de référencement

Jetez un œil au schéma de référencement suivant -

<?xml version = "1.0"?>

<class xmlns = "http://www.tutorialspoint.com"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://www.tutorialspoint.com student.xsd">  
   
   <student rollno = "393">    
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   
   <student rollno = "493">	 
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   
   <student rollno = "593">    
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>
xmlns = "http://www.tutorialspoint.com"

Le fragment ci-dessus spécifie la déclaration d'espace de noms par défaut. Cet espace de noms est utilisé par le validateur de schéma vérifiant que tous les éléments font partie de cet espace de noms. C'est facultatif.

xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.tutorialspoint.com student.xsd">

Après avoir défini l'instance XMLSchema xsi, utilisez schemaLocationattribut. Cet attribut a deux valeurs, l'espace de noms et l'emplacement du schéma XML, à utiliser séparés par un espace. C'est facultatif.

Nous utiliserons le validateur XSD basé sur Java pour valider students.xml contre la students.xsd.

étudiants.xml

<?xml version = "1.0"?>

<class>  
   <student rollno = "393">
      <firstname>Dinkar</firstname>    
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>	 
   </student>
   
   <student rollno = "493">	 
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   
   <student rollno = "593">    
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

étudiants.xsd

<?xml version = "1.0"?>

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
   <xs:element name = 'class'>
      <xs:complexType>
         <xs:sequence>
             <xs:element name = 'student' type = 'StudentType' minOccurs = '0' 
                maxOccurs = 'unbounded' />
         </xs:sequence>
      </xs:complexType>
   </xs:element>

   <xs:complexType name = "StudentType">
      <xs:sequence>
         <xs:element name = "firstname" type = "xs:string"/>
         <xs:element name = "lastname" type = "xs:string"/>
         <xs:element name = "nickname" type = "xs:string"/>
         <xs:element name = "marks" type = "xs:positiveInteger"/>
      </xs:sequence>
      <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
   </xs:complexType>			 
</xs:schema>

XSDValidator.java

import java.io.File;
import java.io.IOException;

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;

import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.xml.sax.SAXException;

public class XSDValidator {
   public static void main(String[] args) {
      if(args.length !=2){
         System.out.println("Usage : XSDValidator <file-name.xsd> <file-name.xml>" );
      } else {
         boolean isValid = validateXMLSchema(args[0],args[1]);
         
         if(isValid){
            System.out.println(args[1] + " is valid against " + args[0]);
         } else {
            System.out.println(args[1] + " is not valid against " + args[0]);
         }
      }
   }
   
   public static boolean validateXMLSchema(String xsdPath, String xmlPath){
      try {
         SchemaFactory factory =
            SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = factory.newSchema(new File(xsdPath));
            Validator validator = schema.newValidator();
            validator.validate(new StreamSource(new File(xmlPath)));
      } catch (IOException e){
         System.out.println("Exception: "+e.getMessage());
         return false;
      } catch(SAXException e1){
         System.out.println("SAX Exception: "+e1.getMessage());
         return false;
      }
		
      return true;
   }
}

Étapes pour valider XML par rapport à XSD

  • Copiez le XSDValidator.java fichier à n'importe quel emplacement, par exemple E: > java

  • Copiez le students.xml au même endroit E: > java

  • Copiez le students.xsd au même endroit E: > java

  • Compiler XSDValidator.javaen utilisant la console. Assurez-vous que le JDK 1.5 et les versions ultérieures sont installés sur votre machine et que les chemins de classe sont configurés. Pour plus d'informations sur l'utilisation de JAVA, consultez le didacticiel JAVA

E:\java\javac XSDValidator.java
  • Exécuter XSDValidator avec students.xsd et students.xml passé en argument.

E:\java\java XSDValidator students.xsd students.xml

Vérifiez la sortie

Vous verrez le résultat suivant -

students.xml is valid against students.xsd

Dans ce chapitre, nous verrons les types simples définis par XSD.

S.No. Type et description simples
1

Élément

L'élément simple ne peut contenir que du texte. Il ne peut contenir aucun autre élément.

2

Attribut

L'attribut est lui-même un type et est utilisé dans l'élément complexe.

3

Restriction

La restriction définit les valeurs acceptables d'un élément XML.

L'élément complexe est un élément XML qui peut contenir d'autres éléments et / ou attributs. Nous pouvons créer un élément complexe de deux manières -

  • Définissez un type complexe puis créez un élément à l'aide du type attribut

  • Définissez un type complexe directement en le nommant

Définissez un type complexe, puis créez un élément à l'aide de l'attribut type.

<xs:complexType name = "StudentType">
   <xs:sequence>
      <xs:element name = "firstname" type = "xs:string"/>
      <xs:element name = "lastname" type = "xs:string"/>
      <xs:element name = "nickname" type = "xs:string"/>
      <xs:element name = "marks" type = "xs:positiveInteger"/>
   </xs:sequence>
   <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
</xs:complexType>

<xs:element name = 'student' type = 'StudentType' />

Définissez un type complexe directement en le nommant.

<xs:element name = "student">
   <xs:complexType>   
      <xs:sequence>
         <xs:element name = "firstname" type = "xs:string"/>
         <xs:element name = "lastname" type = "xs:string"/>
         <xs:element name = "nickname" type = "xs:string"/>
         <xs:element name = "marks" type = "xs:positiveInteger"/>
      </xs:sequence>
   <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
   </xs:complexType>
<xs:element>

Voici la liste des types complexes pris en charge par XSD.

S.No. Type et description simples
1

Vide

Complexe L'élément de type complexe vide ne peut avoir que des attributs mais pas de contenu.

2

Éléments seulement

L'élément de type complexe Elements-Only ne peut contenir que des éléments

3

Texte seulement

L'élément de type complexe Texte uniquement ne peut contenir que des attributs et du texte.

4

Mixte

L'élément de type complexe mixte peut contenir un élément, un attribut et du texte.

5

Indicateurs

Les indicateurs contrôlent la manière dont les éléments doivent être organisés dans un document XML.

6

L'élément <any> est utilisé pour les éléments qui ne sont pas définis par le schéma

sept

L'attribut <anyAttribute> est utilisé pour les attributs qui ne sont pas définis par le schéma.

Les types de données chaîne sont utilisés pour représenter des caractères dans les documents XML.

<xs: string> type de données

Le type de données <xs: string> peut prendre des caractères, des sauts de ligne, des retours chariot et des caractères de tabulation. Le processeur XML ne remplace pas les sauts de ligne, les retours chariot et les caractères de tabulation dans le contenu par des espaces et les garde intacts. Par exemple, plusieurs espaces ou onglets sont conservés lors de l'affichage.

<xs: string> Exemple

Déclaration d'élément dans xsd -

<xs:element name = "name" type = "xs:string"/>

Utilisation des éléments en xml -

<name>Dinkar</name>
<name>Dinkar    Kad</name>

<xs: token> type de données

Le type de données <xs: token> est dérivé du type de données <string> et peut prendre des caractères, des sauts de ligne, des retours chariot et des caractères de tabulation. Le processeur XML supprimera les sauts de ligne, les tabulations, les retours chariot, les espaces de début et de fin et les espaces multiples.

<xs: token> Exemple

Déclaration d'élément dans xsd -

<xs:element name = "name" type = "xs:token"/>

Utilisation des éléments en xml -

<name>Dinkar</name>
<name>Dinkar    Kad</name>

Types de données de chaîne

Voici la liste des types de données couramment utilisés qui sont dérivés du type de données <chaîne>.

S.No. Nom et description
1

ID

Représente l'attribut ID en XML et est utilisé dans les attributs de schéma.

2

IDREF

Représente l'attribut IDREF en XML et est utilisé dans les attributs de schéma.

3

language

Représente un identifiant de langue valide

4

Name

Représente un nom XML valide

5

NMTOKEN

Représente un attribut NMTOKEN en XML et est utilisé dans les attributs de schéma.

6

normalizedString

Représente une chaîne qui ne contient pas de sauts de ligne, de retours chariot ou de tabulations.

sept

string

Représente une chaîne qui peut contenir des sauts de ligne, des retours chariot ou des tabulations.

8

token

Représente une chaîne qui ne contient pas de sauts de ligne, de retours chariot, de tabulations, d'espaces de début ou de fin ou de plusieurs espaces

Restrictions

Les types de restrictions suivants peuvent être utilisés avec les types de données String -

  • enumeration
  • length
  • maxLength
  • minLength
  • pattern
  • whiteSpace

Les types de données Date et Heure sont utilisés pour représenter la date et l'heure dans les documents XML.

<xs: date> type de données

Le type de données <xs: date> est utilisé pour représenter la date au format AAAA-MM-JJ.

  • YYYY - représente l'année

  • MM - représente le mois

  • DD - représente le jour

<xs: date> Exemple

Déclaration d'élément en XSD -

<xs:element name = "birthdate" type = "xs:date"/>

Utilisation des éléments en XML -

<birthdate>1980-03-23</birthdate>

<xs: time> type de données

Le type de données <xs: time> est utilisé pour représenter l'heure au format hh: mm: ss.

  • hh - représente les heures

  • mm - représente les minutes

  • ss - représente les secondes

<xs: time> Exemple

Déclaration d'élément en XSD -

<xs:element name = "startTime" type = "xs:time"/>

Utilisation des éléments en XML -

<startTime>10:20:15</startTime>

<xs: datetime> type de données

Le type de données <xs: datetime> est utilisé pour représenter la date et l'heure au format AAAA-MM-JJThh: mm: ss.

  • YYYY - représente l'année

  • MM - représente le mois

  • DD - représente le jour

  • T - représente la section de début de temps

  • hh - représente les heures

  • mm - représente les minutes

  • ss - représente les secondes

<xs: datetime> Exemple

Déclaration d'élément en XSD -

<xs:element name = "startTime" type = "xs:datetime"/>

Utilisation des éléments en XML -

<startTime>1980-03-23T10:20:15</startTime>

<xs: duration> type de données

Le type de données <xs: duration> est utilisé pour représenter l'intervalle de temps au format PnYnMnDTnHnMnS. Chaque composant est optionnel sauf P.

  • P - représente la section de début de date

  • nY - représente l'année

  • nM - représente le mois

  • nD - représente le jour

  • T - représente la section de début de temps

  • nH - représente les heures

  • nM - représente les minutes

  • nS - représente les secondes

<xs: duration> Exemple

Déclaration d'élément en XSD -

<xs:element name = "period" type = "xs:duration"/>

Utilisation des éléments en xml pour représenter une période de 6 ans, 3 mois, 10 jours et 15 heures.

<period>P6Y3M10DT15H</period>

Types de données de date

Voici la liste des types de données de date couramment utilisés.

S.No. Nom et description
1.

date

Représente une valeur de date

2.

dateTime

Représente une valeur de date et d'heure

3.

duration

Représente un intervalle de temps

4.

gDay

Représente une partie d'une date en tant que jour (JJ)

5.

gMonth

Représente une partie d'une date sous forme de mois (MM)

6.

gMonthDay

Représente une partie d'une date sous forme de mois et de jour (MM-JJ)

sept.

gYear

Représente une partie d'une date sous forme d'année (AAAA)

8.

gYearMonth

Représente une partie d'une date sous forme d'année et de mois (AAAA-MM)

9.

time

Représente une valeur de temps

Restrictions

Les types de restrictions suivants peuvent être utilisés avec les types de données Date -

  • enumeration
  • maxExclusive
  • maxInclusive
  • minExclusive
  • minInclusive
  • pattern
  • whiteSpace

Les types de données numériques sont utilisés pour représenter les nombres dans les documents XML.

<xs: decimal> type de données

Le type de données <xs: decimal> est utilisé pour représenter des valeurs numériques. Il prend en charge les nombres décimaux jusqu'à 18 chiffres.

<xs: decimal> Exemple

Déclaration d'élément en XSD -

<xs:element name = "score" type = "xs:decimal"/>

Utilisation des éléments en XML -

<score>9.12</score>

<xs: integer> type de données

Le type de données <xs: integer> est utilisé pour représenter des valeurs entières.

<xs: integer> Exemple

Déclaration d'élément en XSD -

<xs:element name = "score" type = "xs:integer"/>

Utilisation des éléments en XML -

<score>9</score>

Types de données numériques

Voici la liste des types de données numériques couramment utilisés.

S.No. Nom et description
1.

byte

Un entier signé de 8 bits

2.

decimal

Une valeur décimale

3.

int

Un entier 32 bits signé

4.

integer

Une valeur entière

5.

long

Un entier 64 bits signé

6.

negativeInteger

Un entier n'ayant que des valeurs négatives (.., - 2, -1)

sept.

nonNegativeInteger

Un entier n'ayant que des valeurs non négatives (0,1,2, ..)

8.

nonPositiveInteger

Un entier n'ayant que des valeurs non positives (.., - 2, -1,0)

9.

positiveInteger

Un entier n'ayant que des valeurs positives (1,2, ..)

dix.

short

Un entier 16 bits signé

11.

unsignedLong

Un entier 64 bits non signé

12.

unsignedInt

Un entier 32 bits non signé

13.

unsignedShort

Un entier 16 bits non signé

14.

unsignedByte

Un entier 8 bits non signé

Restrictions

Les types de restrictions suivants peuvent être utilisés avec les types de données Date -

  • enumeration
  • fractionDigits
  • maxExclusive
  • maxInclusive
  • minExclusive
  • minInclusive
  • pattern
  • totalDigits
  • whiteSpace

XSD a quelques autres types de données importants, tels que Boolean, binary, et anyURI.

<xs: boolean> type de données

Le type de données <xs: boolean> est utilisé pour représenter la valeur true, false, 1 (pour true) ou 0 (pour false).

<xs: boolean> Exemple

Déclaration d'élément en XSD -

<xs:element name = "pass" type = "xs:boolean"/>

Utilisation des éléments en XML -

<pass>false</pass>

Types de données binaires

Les types de données binaires sont utilisés pour représenter des valeurs binaires. Deux types binaires sont couramment utilisés.

  • base64Binary - représente des données binaires encodées en base64

  • hexBinary - représente des données binaires codées en hexadécimal

<xs: hexbinary> Exemple

Déclaration d'élément en XSD -

<xs:element name = "blob" type = "xs:hexBinary"/>

Utilisation des éléments en XML -

<blob>9FEEF</blob>

<xs: anyURI> type de données

Le type de données <xs: anyURI> est utilisé pour représenter l'URI.

<xs: anyURI> Exemple

Déclaration d'élément en XSD -

<xs:attribute name = "resource" type = "xs:anyURI"/>

Utilisation des éléments en XML -

<image resource = "http://www.tutorialspoint.com/images/smiley.jpg" />

Types de données numériques

Voici la liste des types de données numériques couramment utilisés.

S.No. Nom et description
1.

byte

Un entier signé de 8 bits

2.

decimal

Une valeur décimale

3.

int

Un entier 32 bits signé

4.

integer

Une valeur entière

5.

long

Un entier 64 bits signé

6.

negativeInteger

Un entier n'ayant que des valeurs négatives (.., - 2, -1)

sept.

nonNegativeInteger

Un entier n'ayant que des valeurs non négatives (0,1,2, ..)

8.

nonPositiveInteger

Un entier n'ayant que des valeurs non positives (.., - 2, -1,0)

9.

positiveInteger

Un entier n'ayant que des valeurs positives (1,2, ..)

dix.

short

Un entier 16 bits signé

11.

unsignedLong

Un entier 64 bits non signé

12.

unsignedInt

Un entier 32 bits non signé

13.

unsignedShort

Un entier 16 bits non signé

14.

unsignedByte

Un entier 8 bits non signé

Restrictions

Les types de restrictions suivants peuvent être utilisés avec les types de données Divers sauf sur le type de données booléen -

  • enumeration
  • length
  • maxLength
  • minLength
  • pattern
  • whiteSpace