|
Illustriamo ora la struttura di un file XSD e i suoi principali componenti, conlo scopo è quello di fornire una conoscenza base dell’XSD; per una trattazione completa di XSD potete fare riferimento a [1]. Tutti i componenti del XML schema sono contenuti all’interno della seguente struttura: <?xml version="1.0" encoding="UTF-8"?> <xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"> … [componenti] … </xs:schema> come possiamo vedere è stato definito il namespace xs e quindi tutti i componenti dell’XML schema saranno preceduti da “xs:” -Dichiarazione di un elemento Il componente principale di un XML schema è ELEMENT che definisce i tag che saranno contenuti nel nostro formato xml: <xs:element name="mioTag" type="xs:string"/> In questo caso “mioTag” sarà un tag valido all’interno del mio file XML e dovrà contenere una stringa. Posso anche definire altre caratteristiche del mio elemento oltre al nome e al tipo, come il valore di default del mio tag, oppure il numero massimo e minimo di occorrenze che posso avere per questo determinato tag. XML schema ha un certo insieme di tipi di dato predefiniti; i più comuni sono i seguenti: - xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
E’ pero possibile definire dei nuovi tipi di dato, semplici o complessi con cui possiamo definire i nostri element. -Definizione di un tipo XML schema ci permette di definire nuovi tipi di dato oltre quelli predefiniti; Tipi semplici: Posso definire tipi di dato semplici, i quali non possono contenere altri elementi e non prevedono attributi. Vengono spesso utilizzati per derivare i tipi di dato predefiniti vincolando i valori ad uno specifico sottoinsieme. Ad esempio <xs:simpleType name="intervallo"> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> <xs:maxInclusive value="100"/> </xs:restriction> </xs:simpleType> <xs:element name="valore" type="xs:intervallo"> Abbiamo definito un nuovo tipo di dato “intervallo” che deriva da xs:integer ma limita i valori possibili tra 0 e 100. In seguito è stato dichiarato un elemento “valore” di tipo intervallo. Vedremo nel dettaglio le restrictions più avanti. Tipi complessi: Un tipo di dato complesso, al contrario dei tipo semplice, può contenere altri elementi e degli attributi: <xs:complexType name="personainfo"> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name="cognome" type="xs:string"/> <xs:element name="professione" type="xs:string"/> <xs:element name="nazionalità" type="xs:string"/> </xs:sequence> <xs:attribute name="lingua" type="xs:string" default="IT"/> </xs:complexType> <xs:element name="impiegato" type="personainfo"/> Il tipo complesso “personainfo” è formato da 4 elementi di tipo stringa (nome,cognome,professione ,nazionalità) e un attributo che descrive la lingua in cui sono espressi gli elementi. Il tag “xs:sequence” è un indicatore di ordine; gli indicatori di ordine specificano come gli elementi figli devono occorrere: - “xs:sequence” specifica che gli elementi figli devono apparire nell’ordine con cui sono stati impostati.
- “xs:all” specifica che ogni elemento figlio deve apparire una e una sola vota senza un ordine prestabilito.
- “xs:choice” indica che posso avere solo uno degli elementi figli specificati.
Gli elementi che formano un tipo complesso possono essere a loro volta di tipo complesso. -Dichiarazione di un attributo Come abbiamo visto nell’esempio precedente, è possibile definire uno o più attributi per un certo tipo di elemento che abbiamo definito. Tutti gli attributi sono dichiarati come tipi semplici. La sintassi per dichiarare un attributo è : <xs:attribute name="xxx" type="yyy" default="zzz" use="required"/> dove “default” definisce il valore dell’attributo se non viene specificato, e “use” definisce le l’attributo è richiesto o opzionale. -Facets I Facets sono delle restrizioni che usate per controllare i valori accettabili di un tag o di un attributo. Il costrutto che viene utilizzato per implementare i Facets è “xs:restictions” che abbiamo incontrato nella definizione dei tipi semplici. La sintassi è la seguente: <xs:simpleType name="nomeTipo"> <xs:restriction base="[tipo base]"> … <xs:[tipo restriction] value="[valore]"/> … </xs:restriction> </xs:simpleType> dove [tipo base] è il tipo di partenza a cui sono applicate le restrizioni, [tipo restriction] è il tipo di restrizione applicata (vedi tabella 1), [valore] è il valore con cui viene applicata la restrizione. Sono possibili diversi tipi di restrizioni, riportiamo di seguito una tabellacon tutte le restrizioni possibili: | Restrictions | Descrizione | | enumeration | Definisce una lista di valori accettabili | | fractionDigits | Specifica il numero massimo di decimali possibili. Deve essere maggiore o uguale a zero | | length | Specifica il numero esatto di caratteri o di elementi permessi. Deve essere maggiore o uguale a zero | | maxExclusive | Specifica il limite massimo per un valore numerico (il valore specificato è escluso) | | maxInclusive | Specifica il limite massimo per un valore numerico (il valore specificato è incluso) | | maxLength | Specifica il numero massimo di caratteri o di elementi permessi. Deve essere maggiore o uguale a zero | | minExclusive | Specifica il limite minimo per un valore numerico (il valore specificato è escluso) | | minInclusive | Specifica il limite minimo per un valore numerico (il valore specificato è incluso) | | minLength | Specifica il numero minimo di caratteri o di elementi permessi. Deve essere maggiore o uguale a zero | | pattern | Definisce l’esatta sequenza di caratteri accettabile. | | totalDigits | Specifica il numero esatto di cifre permesse. Deve essere maggiore o uguale a zero | | whiteSpace | Specifica come sono gestiti gli spazi bianchi (line feeds, tabs, spazi, e carriage returns). | Tabella 1 L’utilizzo dei Facets permette di automatizzare molti controlli usati comunemente in varie applicazioni; per una trattazione completa dei Facets fate riferimento a [1]. A questo punto abbiamo le basi per poter creare un primo XML schema; immaginiamo di dover creare un XML schema per descrivere il formato dei dati di un’assicurazione: <?xml version="1.0" encoding="UTF-8"?> <xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.k-tech.it/Assicurazione"xmlns:as="http://www.k-tech.it/Assicurazione"elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="Assicurazione"> <xs:complexType> <xs:sequence> <xs:element name="Autisti" type="as:AnagraficaType" maxOccurs="unbounded"/> <xs:element name="Veicolo" type="as:VeicoloType"/> <xs:element name="Opzioni" type="as:OpzioniType"/> </xs:sequence> <xs:attribute name="Lingua" type="xs:string" use="required"/> </xs:complexType> </xs:element> <xs:simpleType name="AutoType"> <xs:restriction base="xs:string"> <xs:enumeration value="Audi"/> <xs:enumeration value="Bmw"/> <xs:enumeration value="Mercedes"/> </xs:restriction> </xs:simpleType> <xs:complexType name="OptionalType"> <xs:sequence> <xs:element name="ABS" type="xs:boolean"/> <xs:element name="Antifurto" type="xs:boolean"/> </xs:sequence> </xs:complexType> <xs:complexType name="AnagraficaType"> <xs:sequence> <xs:element name="Nome" type="xs:string"/> <xs:element name="Cognome" type="xs:string"/> <xs:element name="Età" type="xs:int"/> <xs:element name="Provincia" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="VeicoloType"> <xs:sequence> <xs:element name="Marca" type="as:AutoType"/> <xs:element name="Modello" type="xs:string"/> <xs:element name="Optional" type="as:OptionalType" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:complexType name="OpzioniType"> <xs:sequence> <xs:element name="BonusMalus" type="xs:int"/> <xs:element name="FurtoIncendio" type="xs:boolean"/> <xs:element name="AttiVandalici" type="xs:boolean"/> </xs:sequence> </xs:complexType> </xs:schema> Listato assicurazione.xsd Per la costruzione dell’XML schema consigliamo di utilizzare un tool per la gestione di file XML; per esempio XMLSpy [2] permette la costruzione in modo grafico dell’XSD:
|