XSD - Guida rapida

XML Schema Definition, comunemente noto come XSD, è un modo per descrivere con precisione il linguaggio XML. XSD controlla la validità della struttura e del vocabolario di un documento XML rispetto alle regole grammaticali del linguaggio XML appropriato.

Un documento XML può essere definito come:

  • Well-formed- Se il documento XML aderisce a tutte le regole XML generali, come i tag, devono essere nidificati correttamente, i tag di apertura e di chiusura devono essere bilanciati e i tag vuoti devono terminare con "/>", allora viene chiamato ben formato .

    OR

  • Valid- Un documento XML che si dice valido quando non solo è ben formato , ma è anche conforme all'XSD disponibile che specifica quali tag utilizza, quali attributi questi tag possono contenere e quali tag possono essere presenti all'interno di altri tag, tra le altre proprietà .

Il diagramma seguente mostra come XSD viene utilizzato per strutturare i documenti XML:

Ecco un semplice codice XSD. Dai un'occhiata.

<?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>

Caratteristiche

Ecco un elenco di alcune delle caratteristiche popolari di XSD:

  • Gli XSD possono essere estensibili per aggiunte future.
  • XSD è più ricco e potente del DTD.
  • XSD è scritto in XML.
  • XSD supporta i tipi di dati.
  • XSD supporta gli spazi dei nomi.
  • XSD è la raccomandazione del W3C.

Un XSD XML viene conservato in un documento separato e quindi il documento può essere collegato a un documento XML per utilizzarlo.

Sintassi

La sintassi di base di un XSD è la seguente:

<?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>

Elemento <Schema>

Lo schema è l'elemento radice di XSD ed è sempre obbligatorio.

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

Il frammento precedente specifica che gli elementi ei tipi di dati utilizzati nello schema sono definiti in http://www.w3.org/2001/XMLSchema spazio dei nomi e questi elementi / tipi di dati dovrebbero essere preceduti da xs. È sempre necessario.

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

Il frammento precedente specifica che gli elementi utilizzati in questo schema sono definiti in http://www.tutorialspoint.comspazio dei nomi. È facoltativo.

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

Il frammento precedente specifica che lo spazio dei nomi predefinito è http://www.tutorialspoint.com.

elementFormDefault = "qualified"

Il frammento precedente indica che qualsiasi elemento dichiarato in questo schema deve essere qualificato come spazio dei nomi prima di utilizzarlo in qualsiasi documento XML. È facoltativo.

Schema di riferimento

Dai un'occhiata al seguente schema di riferimento:

<?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"

Il frammento precedente specifica la dichiarazione dello spazio dei nomi predefinito. Questo spazio dei nomi viene utilizzato dal validatore dello schema, controlla che tutti gli elementi facciano parte di questo spazio dei nomi. È facoltativo.

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

Dopo aver definito l'xsi dell'istanza XMLSchema, utilizzare schemaLocationattributo. Questo attributo ha due valori, spazio dei nomi e posizione dello schema XML, da utilizzare separati da uno spazio. È facoltativo.

Useremo il validatore XSD basato su Java per convalidare students.xml contro il students.xsd.

students.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>

studenti.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;
   }
}

Passaggi per convalidare XML rispetto a XSD

  • Copia il file XSDValidator.java file in qualsiasi posizione, ad esempio E: > java

  • Copia il file students.xml nella stessa posizione E: > java

  • Copia il file students.xsd nella stessa posizione E: > java

  • Compilare XSDValidator.javautilizzando la console. Assicurati di avere JDK 1.5 in poi installato sulla tua macchina e che i classpath siano configurati. Per i dettagli su come usare JAVA, vedere il Tutorial JAVA

E:\java\javac XSDValidator.java
  • Eseguire XSDValidator con students.xsd e students.xml passato come argomento.

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

Verifica l'output

Vedrai il seguente risultato:

students.xml is valid against students.xsd

In questo capitolo vedremo i tipi semplici definiti da XSD.

S.No. Tipo e descrizione semplici
1

Elemento

L'elemento semplice può contenere solo testo. Non può contenere nessun altro elemento.

2

Attributo

L'attributo è esso stesso un tipo e viene utilizzato in Complex Element.

3

Restrizione

La restrizione definisce i valori accettabili di un elemento XML.

L'elemento complesso è un elemento XML che può contenere altri elementi e / o attributi. Possiamo creare un elemento complesso in due modi:

  • Definisci un tipo complesso e quindi crea un elemento utilizzando il type attributo

  • Definisci un tipo complesso direttamente nominando

Definire un tipo complesso e quindi creare un elemento utilizzando l'attributo 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' />

Definisci un tipo complesso direttamente nominando.

<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>

Di seguito è riportato l'elenco dei tipi complessi supportati da XSD.

S.No. Tipo e descrizione semplici
1

Vuoto

Complesso L'elemento di tipo complesso vuoto può avere solo attributi ma nessun contenuto.

2

Solo elementi

L'elemento di tipo complesso Solo elementi può contenere solo elementi

3

Solo testo

L'elemento di tipo complesso Solo testo può contenere solo attributi e testo.

4

Misto

L'elemento di tipo complesso misto può contenere elemento, attributo e testo.

5

Indicatori

Gli indicatori controllano il modo in cui gli elementi devono essere organizzati in un documento XML.

6

<qualsiasi>

L'elemento <any> viene utilizzato per gli elementi che non sono definiti dallo schema

7

<anyAttribute>

L'attributo <anyAttribute> viene utilizzato per attributi non definiti dallo schema.

I tipi di dati stringa vengono utilizzati per rappresentare i caratteri nei documenti XML.

<xs: string> tipo di dati

Il tipo di dati <xs: string> può accettare caratteri, avanzamenti riga, ritorni a capo e caratteri di tabulazione. Il processore XML non sostituisce gli avanzamenti riga, i ritorni a capo e i caratteri di tabulazione nel contenuto con spazio e li mantiene intatti. Ad esempio, più spazi o tabulazioni vengono conservati durante la visualizzazione.

<xs: string> Esempio

Dichiarazione dell'elemento in xsd -

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

Utilizzo degli elementi in xml -

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

Tipo di dati <xs: token>

Il tipo di dati <xs: token> deriva dal tipo di dati <string> e può accettare caratteri, avanzamenti riga, ritorni a capo e caratteri di tabulazione. Il processore XML rimuoverà gli avanzamenti riga, le tabulazioni, i ritorni a capo, gli spazi iniziali e finali e più spazi.

<xs: token> Esempio

Dichiarazione dell'elemento in xsd -

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

Utilizzo degli elementi in xml -

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

Tipi di dati stringa

Di seguito è riportato l'elenco dei tipi di dati comunemente usati che derivano dal tipo di dati <string>.

S.No. Nome e descrizione
1

ID

Rappresenta l'attributo ID in XML e viene utilizzato negli attributi dello schema.

2

IDREF

Rappresenta l'attributo IDREF in XML e viene utilizzato negli attributi dello schema.

3

language

Rappresenta un ID lingua valido

4

Name

Rappresenta un nome XML valido

5

NMTOKEN

Rappresenta un attributo NMTOKEN in XML e viene utilizzato negli attributi dello schema.

6

normalizedString

Rappresenta una stringa che non contiene avanzamenti riga, ritorni a capo o tabulazioni.

7

string

Rappresenta una stringa che può contenere avanzamenti riga, ritorni a capo o tabulazioni.

8

token

Rappresenta una stringa che non contiene avanzamenti riga, ritorni a capo, tabulazioni, spazi iniziali o finali o più spazi

Restrizioni

I seguenti tipi di restrizioni possono essere utilizzati con i tipi di dati String:

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

I tipi di dati Data e Ora vengono utilizzati per rappresentare la data e l'ora nei documenti XML.

<xs: date> tipo di dati

Il tipo di dati <xs: date> viene utilizzato per rappresentare la data nel formato AAAA-MM-GG.

  • YYYY - rappresenta l'anno

  • MM - rappresenta il mese

  • DD - rappresenta il giorno

<xs: date> Esempio

Dichiarazione dell'elemento in XSD -

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

Utilizzo degli elementi in XML -

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

Tipo di dati <xs: time>

Il tipo di dati <xs: time> viene utilizzato per rappresentare l'ora nel formato hh: mm: ss.

  • hh - rappresenta le ore

  • mm - rappresenta i minuti

  • ss - rappresenta i secondi

<xs: time> Esempio

Dichiarazione dell'elemento in XSD -

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

Utilizzo degli elementi in XML -

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

Tipo di dati <xs: datetime>

Il tipo di dati <xs: datetime> viene utilizzato per rappresentare la data e l'ora nel formato AAAA-MM-GGThh: mm: ss.

  • YYYY - rappresenta l'anno

  • MM - rappresenta il mese

  • DD - rappresenta il giorno

  • T - rappresenta l'inizio della sezione temporale

  • hh - rappresenta le ore

  • mm - rappresenta i minuti

  • ss - rappresenta i secondi

<xs: datetime> Esempio

Dichiarazione dell'elemento in XSD -

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

Utilizzo degli elementi in XML -

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

Tipo di dati <xs: duration>

Il tipo di dati <xs: duration> viene utilizzato per rappresentare l'intervallo di tempo nel formato PnYnMnDTnHnMnS. Ogni componente è opzionale tranne P.

  • P - rappresenta l'inizio della sezione data

  • nY - rappresenta l'anno

  • nM - rappresenta il mese

  • nD - rappresenta il giorno

  • T - rappresenta l'inizio della sezione temporale

  • nH - rappresenta le ore

  • nM - rappresenta i minuti

  • nS - rappresenta i secondi

<xs: duration> Esempio

Dichiarazione dell'elemento in XSD -

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

Utilizzo dell'elemento in xml per rappresentare un periodo di 6 anni, 3 mesi, 10 giorni e 15 ore.

<period>P6Y3M10DT15H</period>

Tipi di dati data

Di seguito è riportato l'elenco dei tipi di dati di data comunemente utilizzati.

S.No. Nome e descrizione
1.

date

Rappresenta un valore di data

2.

dateTime

Rappresenta un valore di data e ora

3.

duration

Rappresenta un intervallo di tempo

4.

gDay

Rappresenta una parte di una data come il giorno (GG)

5.

gMonth

Rappresenta una parte di una data come il mese (MM)

6.

gMonthDay

Rappresenta una parte di una data come mese e giorno (MM-DD)

7.

gYear

Rappresenta una parte di una data come anno (AAAA)

8.

gYearMonth

Rappresenta una parte di una data come anno e mese (AAAA-MM)

9.

time

Rappresenta un valore temporale

Restrizioni

I seguenti tipi di restrizioni possono essere utilizzati con i tipi di dati Data:

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

I tipi di dati numerici vengono utilizzati per rappresentare i numeri nei documenti XML.

Tipo di dati <xs: decimal>

Il tipo di dati <xs: decimal> viene utilizzato per rappresentare valori numerici. Supporta numeri decimali fino a 18 cifre.

<xs: decimal> Esempio

Dichiarazione dell'elemento in XSD -

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

Utilizzo degli elementi in XML -

<score>9.12</score>

Tipo di dati <xs: integer>

Il tipo di dati <xs: integer> viene utilizzato per rappresentare valori interi.

<xs: integer> Esempio

Dichiarazione dell'elemento in XSD -

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

Utilizzo degli elementi in XML -

<score>9</score>

Tipi di dati numerici

Di seguito è riportato l'elenco dei tipi di dati numerici comunemente utilizzati.

S.No. Nome e descrizione
1.

byte

Un numero intero a 8 bit con segno

2.

decimal

Un valore decimale

3.

int

Un numero intero a 32 bit con segno

4.

integer

Un valore intero

5.

long

Un numero intero a 64 bit con segno

6.

negativeInteger

Un numero intero con solo valori negativi (.., - 2, -1)

7.

nonNegativeInteger

Un numero intero con solo valori non negativi (0,1,2, ..)

8.

nonPositiveInteger

Un numero intero con solo valori non positivi (.., - 2, -1,0)

9.

positiveInteger

Un numero intero con solo valori positivi (1,2, ..)

10.

short

Un numero intero a 16 bit con segno

11.

unsignedLong

Un numero intero a 64 bit senza segno

12.

unsignedInt

Un numero intero a 32 bit senza segno

13.

unsignedShort

Un numero intero a 16 bit senza segno

14.

unsignedByte

Un numero intero a 8 bit senza segno

Restrizioni

I seguenti tipi di restrizioni possono essere utilizzati con i tipi di dati Data:

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

XSD ha alcuni altri importanti tipi di dati, come Boolean, binary, e anyURI.

Tipo di dati <xs: boolean>

Il tipo di dati <xs: boolean> viene utilizzato per rappresentare il valore vero, falso, 1 (per vero) o 0 (per falso).

<xs: boolean> Esempio

Dichiarazione dell'elemento in XSD -

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

Utilizzo degli elementi in XML -

<pass>false</pass>

Tipi di dati binari

I tipi di dati binari vengono utilizzati per rappresentare valori binari. Due tipi binari sono comuni in uso.

  • base64Binary - rappresenta i dati binari con codifica base64

  • hexBinary - rappresenta i dati binari codificati esadecimali

<xs: hexbinary> Esempio

Dichiarazione dell'elemento in XSD -

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

Utilizzo degli elementi in XML -

<blob>9FEEF</blob>

Tipo di dati <xs: anyURI>

Il tipo di dati <xs: anyURI> viene utilizzato per rappresentare l'URI.

<xs: anyURI> Esempio

Dichiarazione dell'elemento in XSD -

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

Utilizzo degli elementi in XML -

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

Tipi di dati numerici

Di seguito è riportato l'elenco dei tipi di dati numerici comunemente utilizzati.

S.No. Nome e descrizione
1.

byte

Un numero intero a 8 bit con segno

2.

decimal

Un valore decimale

3.

int

Un numero intero a 32 bit con segno

4.

integer

Un valore intero

5.

long

Un numero intero a 64 bit con segno

6.

negativeInteger

Un numero intero con solo valori negativi (.., - 2, -1)

7.

nonNegativeInteger

Un numero intero con solo valori non negativi (0,1,2, ..)

8.

nonPositiveInteger

Un numero intero con solo valori non positivi (.., - 2, -1,0)

9.

positiveInteger

Un numero intero con solo valori positivi (1,2, ..)

10.

short

Un numero intero a 16 bit con segno

11.

unsignedLong

Un numero intero a 64 bit senza segno

12.

unsignedInt

Un numero intero a 32 bit senza segno

13.

unsignedShort

Un numero intero a 16 bit senza segno

14.

unsignedByte

Un numero intero a 8 bit senza segno

Restrizioni

I seguenti tipi di restrizioni possono essere utilizzati con i tipi di dati Varie tranne sul tipo di dati booleano:

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