XSD (XML Schema Definition) és un sistema per a definir el vocabulari i les regles que han de complir els fitxers XML. En aquest sentit, la finalitat dels fitxers XSD és la mateixa que la dels DTD, tot i que són sistemes diferents.
Diferències entre DTD i XSD
Concepte | DTD | XSD |
Llenguatge | No és XML | XML |
Definició estructura | Limitada. Insuficient per a continguts mixtes. Repeticions de les etiquetes limitades a 0, 1 o moltes (poc concret). | Permet definició acurada d'elements mixtes. Especificació del número de repeticions màxim i mínim que es pot repetir una etiqueta. |
Tipus de dades | Molt limitat | Disposa dels tipus disponibles en els llenguatges de programació. Possibilitat de definir nous tipus. |
Múltiples espais de noms | Només un DTD per document | Possibilitat de disposar de múltiples diccionaris (espais de noms diferents). |
Exemple XSD Basic
Fitxer XSD
Nom fitxer: BasicExample.xsd
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/Alumne"
xmlns:tns="http://www.example.org/Alumne"
elementFormDefault="qualified"
>
<element name = 'alumne' type = "string" />
</schema>
Anàlisi fitxer BasicExample.xsd - Schema
La primera diferència en realció al DTD és l'utilització de llenguatge XML. El node arrel d'un document xsd és sempre l'etiqueta schema . Observem que aquesta etiqueta utilitza el prefix xs definit per l'espai de noms (http://www.w3.org/2001/XMLSchema).
Els nodes fills al node schema són els que utilitzem per a definir quines seran les regles que han de complir els documents XML per tal que siguin vàlids en relació a l'esquema. En l'exemple definim que l'etiqueta alumne, atribut name de l'etiqueta xs:element, ha de ser una cadena de caràcters o string.
Fitxer XML
Nom fitxer: BasicExample.xml
<?xml version="1.0" encoding="UTF-8"?>
<tns:alumne xmlns:tns="http://www.example.org/Alumne"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/Alumne BasicExample.xsd"
>
Alumne1
</tns:alumne>
Anàlisi fitxer BasicExample.xml - XML
En el document XML cal declarar el nostre espai de noms. Aquest espai de noms ha de coincidir amb el valor de l'atribut targetNameSpace . A més cal incloure l'espai de noms associat a l'esquema. Necessitem aquest espai de noms per a definir l'etiqueta xs:schemaLocation que indica quina és l'ubicació de l'espai de noms. Per tal que el parser sigui capaç de localitzar l'esquema per a validar el document, el valor de l'atribut xsi:schemaLocation ha de ser l'espai de noms especificat en targetNameSpace i l'ubicació del fitxer xsd . En el nostre cas, el fitxer xsd resideix en la mateixa carpeta que el fitxer XML. En el següent exemple es referencia un fitxer xsd ubicat en una carpeta diferent a la del XML.
<?xml version="1.0" encoding="UTF-8"?>
<alumne
xmlns:tns="http://www.example.org/Alumne"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/Alumne ../../Downloads/XSD/BasicExample.xsd"
>
Alumne1
</alumne>
Vídeo : Creació d'un fitxer XML Schema i el fitxer XML associat utilitzant Eclipse IDE
Tipus bàsics en XSD
En XSD hi ha definits tota una sèrie de tipus que ens permeten definir el contingut d'una etiqueta amb exactitud. Alguns dels tipus bàsics disponibles són:
- string
- boolean
- decimal
- float
- double
- duration
- dateTime
- time
- date
- anyURI
Creació de tipus simples (string)
XSD permet definir tipus simples a partir dels tipus bàsics ja existents en el llenguatge. La definició dels tipus bàsics consisteix en incloure certes restriccions en alguns tipus simples. Per a definir un tipus simple utilitzem l'etiqueta simpleType . Les restriccions disponibles quan treballem amb string són:
- length
- minLength
- maxLength
- pattern
- enumeration
Restricció enumeration
Amb aquesta restricció definim quins valors són vàlids per aquells elements que són del nou tipus creat. En l'exemple, definim un tipus tp_currency que defineix dos valors vàlids: lletra "E" per Euros i la lletra "D" per dòlars.
<?xml version="1.0" encoding="UTF-8"?>
.........
<simpleType name="tp_currency">
<restriction base="string">
<enumeration value="E" />
<enumeration value="D" />
</restriction>
</simpleType>
Restricció length
<?xml version="1.0" encoding="UTF-8"?>
.........
<simpleType name="tp_example">
<restriction base="string">
<length value="4" />
</restriction>
</simpleType>
L'exemple anterior defineix un nou tipus de dada de nom tp_example . Aquest tipus de dada només permet cadenes de caràcters que la seva longitud sigui 4 . En el tipus string disposem d'altres restriccions per a poder definir el format de les cadenes de caràcter permeses.
Restricció minLength i maxLength
Amb la restricció minLength i maxLength podem definir el nombre mínim i màxim que ha de tenir una cadena de caràcters per tal sigui correcte. Per exemple, la següent definició obliga a que tots els elements que siguin del tipus tp_exampleMaxMin continguin com a mínim 4 caràcters i fins a un màxim de 10.
<?xml version="1.0" encoding="UTF-8"?>
.........
<simpleType name="tp_exampleMaxMin">
<restriction base="string">
<minLength value="4" />
<maxLength value="10" />
</restriction>
</simpleType>
Restricció pattern
La restricció pattern aplica expressions regulars per a definir quins són els caràcters vàlids i el format vàlid en relació al contingut d'un element determinat. En el següent exemple, l'expressió regular determina que el text ha de començar amb una lletra majúscula, i la resta de caràcters hauran d'estar en minúscules. La longitud del text haurà d'estar en 4 i 10 caràcters per tal que sigui vàlid.
Creació de tipus simples amb valors numèrics
El llenguatge XML Schema Definition (XSD) ens proporciona 4 elements per a gestionar els valors que volem considerar vàlids pels nous tipus definits per a l'usuari. Aquests elements són:
- maxInclusive : el valor especificat haurà de ser >= que el de l'atribut value associat a maxInclusive
- maxExclusive : el valor especificat haurà de ser > que el de l'atribut value associat a maxExclusive
- minInclusive : el valor especificat haurà de ser <= que el de l'atribut value associat a minInclusive
- minExclusive : el valor especificat haurà de ser < que el de l'atribut value associat a minExclusive
Video : Creació de tipus simples amb restriccions
Tipus de dades complexes
Quan una etiqueta conté altres etiquetes o elements hem de declarar l'etiqueta cal crear un tipus complexe de dades. El tipus complexe s'utilitza per a especificar quins elements conté una determinada etiqueta i els atributs associats.
Exemple definició d'un tipus de dada complexe amb XSD
El següent tipus de dada complexe "tp_exemple" és un tipus de dada formada per dos elements o etiquetes: l'etiqueta nom i cognom.
<?xml version="1.0" encoding="UTF-8"?>
.........
<complexType name = "tp_exemple">
<sequence>
<element name = "nom" type = "xs:string"/>
<element name = "cognom" type = "xs:string"/>
</sequence>
</complexType>
Ordre en l'especificació dels elements
Quan s'especifica el tipus complex, pot ser que ens interessi forçar un ordre dels nodes en els documents XML associats a l'esquema o bé que els nodes puguin aparéixer en qualsevol ordre. Per a forçar ordre utilitzem l'etiqueta sequence , tal i com podem observar en l'exemple anterior. Si l'ordre dels elements no és important, podem utilitzar l'etiqueta all . Si el que volem és barrejar etiquetes ordenades i etiquetes desordenades, l'opció passa per crear una etiqueta per englobar els elements ordenats o els desordenats i associar un tipus complexe a aquesta etiqueta.
Exemple definició de tipus complex amb ordre
Per a imposar utilitzem l'etiqueta sequence després de l'etiqueta complexType .
<complexType name="tp_product">
<sequence>
<element name="name" type="tns:tp_name" />
<element name="price" type="tns:tp_price" />
<element name="currency" type="tns:tp_currency" />
</sequence>
</complexType>
Exemple definició de tipus complex sense ordre
Per a NO imposar cap mena d'ordre utilitzem l'etiqueta all després de l'etiqueta complexType .
<complexType name="tp_product">
<all> <!-- If all is used order is free -->
<element name="name" type="tns:tp_name" />
<element name="price" type="tns:tp_price" />
<element name="currency" type="tns:tp_currency" />
</all>
</complexType>
Video: sequence vs all
Cardinalitat dels elements
Per cardinalitat dels elements entenem el nombre de vegades que pot aparéixer una determinada etiqueta. Per a definir aquests límits, en el llenguatge XML schema definition, disposem de dos atributs que podem aplicar a l'etiqueta element : minOccurs i maxOccurs.
Una altre opció relacionada amb la cardinalitat és l'etiqueta choice , que em permet definir diverses etiquetes alternatives
minOccurs i maxOccurs
Com el seu nom indica, l'atribut minOccurs em permet especificar el número mínim d'ocurrències que ha de tenir l'etiqueta associada a l'element. maxOccurs , en canvi, em permet especificar el nombre màxim de repeticions. En el cas que aquest nombre de repeticions màximes no es pugui determinar podem utilitzar el valor "unbounded" per especificar que no hi ha un màxim establert.
Un exemple de l'aplicació de les propietats minOccurs i maxOccurs seria
<complexType name="tp_product">
<sequence>
<element name="name" type="tns:tp_name" />
<element name="price" type="tns:tp_price" />
<element name="currency" type="tns:tp_currency" />
<element name="discount" type="float"
minOccurs="0"
maxOccurs="2" /> <!-- El descompte és opcional però limitat a un màxim de 2 -->
</sequence>
</complexType>
Video: Especificant la cardinalitat mínima i màxima
Etiquetes alternatives i elements sense contingut (EMPTY)
En algunes especificacions és necessari especificar la possibilitat d'escollir una entre diferents etiquetes. En aquest cas, disposem de l'etiqueta choice .
Exemple utilització choice
<complexType name="tp_product">
<sequence>
<element name="name" type="tns:tp_name" />
<element name="price" type="tns:tp_price" />
<element name="currency" type="tns:tp_currency" />
<choice>
<element name="cash" />
<element name="card" />
</choice>
</sequence>
</complexType>
Video: Especificant etiquetes alternatives
Elements mixtes
Els elements mixtes són aquells elements que contenen text i etiquetes. Per a declarar un element mixte en el document XML Schema Definition cal utilitzar l'atribut mixed igualant el seu valor a "true".
<complexType name="tp_product">
<sequence maxOccurs="unbounded">
<element name="name" type="tns:tp_name" />
<element name="price" type="tns:tp_price" />
<element name="currency" type="tns:tp_currency" />
<element name="observations">
<complexType mixed="true" >
<sequence>
<element name="date" type="date"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>