Validació amb XSD
Última actualización
¿Te fue útil?
Última actualización
¿Te fue útil?
L'XSD (XML Schema Definition Language) és una manera més completa de crear validadors per l'XML.
L'objectiu dels XSD és acabar substituint completament als DTD degut a les limitacions que tenen aquests darrers.
Avantatges:
Està escrit en XML i per tant ja en coneixem les regles.
Dóna més control sobre el contingut d'un document XML ja que permet definir la quantitat exacta d'elements fills d'un element.
Actualment es troba en la versió 1.1 (des del 2012) i se'n poden trobar les definicions a la pàgina
La majoria dels validadors poden validar els XML Schemas.
Per exemple amb xmllint ho podem fer:
També es pot fer amb XML Copy Editor, Sublime, Notepad++, etc.
Per fer servir un Schema en el nostre document XML n'hem de definir el lloc on és.
L'especifiquem en l'element arrel del document.
El lloc on està el fitxer també pot ser una URL:
xsi:SchemaLocation="http://www.lloc.com/fitxer.xsd"
On es defineix l'esquema dins de l'estàndard:
On hi ha físicament el fitxer:
Poden ser:
NamespaceSchemaLocation
: Defineix on està l'esquema si necessita espai de noms.
NoNamespaceSchemaLocation
: Defineix l'esquema quan no li fa falta cap espai de noms.
Per exemple, si tenim un document XML:
Li definirem on és el fitxer d'esquema en l'etiqueta arrel:
La definició d'un fitxer d'esquema com que està en XML ha de començar amb l'etiqueta d'XML.
L'etiqueta <schema>
és l'element arrel dels XML Schema:
Com que és XML la etiqueta s'ha de tancar!
Com que es tracta d'un document XML hi podem posar comentaris del tipus:
Però també podem fer servir una forma normalitzada de posar-hi informació:
En XSD tenim diferents tipus d'etiquetes possibles:
Elements de tipus simples: Només contenen text
Elements de tipus complexos: Podem contenir text, altres etiquetes o res.
Sempre tindrem com a mínim un tipus complexe (l'arrel del document).
En Schema un element definit com a simple només conté text.
No té ni atributs.
No té etiquetes filles.
Utilitzant els tipus de dades podem controlar quin és el contingut de les etiquetes.
Exemple per:
XSD
En la definició de l'element es pot veure que definim quin tipus de dades conté l'element.
XML
Els tipus de dades principals són:
xs:string
Contindrà una cadena de caràcters
xs:decimal
Contindrà un número
xs:boolean
Contindrà 'true' o 'false' o (1 o 0)
xs:date
Contindrà una data (AAAA-MM-DD)
xs:anyURI
Contindrà una referència a un lloc (URL, disc...)
Variants de tipus de dades
Els tipus de dades generalment tenen diverses variants per adaptar-se millor a les dades que han de representar:
Text
string, normalizedString, token, Name, NMTOKEN, ...
Números
integer, positiveInteger, negativeInteger, nonNegativeInteger, nonPositiveInteger, long, unsignedLong, int, unsignedInt, byte, unsignedByte, decimal, float, double
Dates
duration, dateTime, date, time, gYear, gMonth, gYearMonth, gDay, gMonthDay
Exemples
<xs:element name="dia" type="xs:date" />
<dia>2020-09-15</dia>
<xs:element name="mes" type="xs:gMonth" />
<mes>--3</mes>
<xs:element name="altura" type="xs:integer" />
<altura>220</altura>
<xs:element name="nom" type="xs:string" />
<nom>Pere</nom>
<xs:element name="lloc" type="xs:anyURI" />
<lloc>http://www.iescendrassos.net</lloc>
Els elements simples també poden tenir altres atributs que ens permetran definir-hi aspectes com:
Valors fixes: "fixed"
Valors per defecte: "default"
Número de vegades que pot sortir una etiqueta: "maxOccurs", "minOccur"
Restringir els valors: "restriction"
Definir patrons que han de complir el contingut
Llistes de valors
Unions
Podem definir que un element té un valor fixe definint-lo amb l'etiqueta 'fixed'
Això ens permet definir:
Però no:
Podem definir que un element té un valor predefinit definint-lo amb l'etiqueta 'default'
Això ens permet definir:
També es pot definir el nombre de vegades que ha de sortir l'element el document XML.
Podem definir el nombre mínim de vegades que ha d'aparèixer:
Si té un valor de 0 és que no té mínim.
També es pot definir el màxim:
'unbounded' implica un número indeterminat de vegades.
Podem definir restriccions als tipus simples perquè s'adaptin a allò que ens interessa.
Definim el tipus amb xs:simpleType
i el restringim amb xs:restriction
Definir tipus
Si hi ha alguna restricció que farem servir més vegades podem definir un tipus amb nom.
Que podrem usar en la definició de l'element:
Tipus de restriccions
Hi ha molts atributs per definir restriccions:
Patrons
Els patrons són un avenç força important amb respecte als DTD.
Els patrons els podem definir amb:
Per exemple podem fer que el contingut d'un camp tingui forma d'un DNI:
que validaria correctament:
Si volem que el contingut sigui una llista de valors ho podem definir amb
xs:list
De manera que podrem definir coses com:
També podem fer que el valor de l'element sigui el resultat d'un tipus o d'un altre.
El valor haurà de ser un valor dels tipus "euros" o de "dolars"
S'han de posar tipus obligatòriament
Un tipus complexe és un element XML que conté elements fills, atributs o una combinació d'ambdós.
Sempre hi haurà com a mínim un tipus complexe en els documents: l'arrel del document.
Hi ha 4 grans grups de tipus complexes:
element buit: Pot contenir atributs (els tipus simples han de contenir text i aquest no en té)
Per exemple: <producte id="123"/>
només text: Conté text i atributs
Per exemple: <food type="dessert">Ice cream</food>
només elements: Conté altres elements
contingut mixt: Pot tenir text, atributs i elements.
Els tipus complexes es desglossen en altres tipus complexes o en tipus simples.
No hi ha tipus complexes predefinits: els hem de definir nosaltres:
El complexType és la base del contingut complexe i el podrem modificar fent servir diferents modificadors:
simpleContent: Permet definir restriccions o extensions a continguts de només text
complexContent: Permet afegir restriccions o extensions d'un tipus complexe
sequence: Defineix seqüències d'etiquetes
all: Permet especificar etiquetes que poden sortir en qualsevol ordre
choice: Permet només un dels elements de dintre del tipus
Seqüències d'elements
<xs:sequence>
en un ordre determinat.
Es defineixen en l'ordre en el que els volem.
Pot contenir altres seqüències ...
Quan ens interessi que els elements apareguin en qualsevol ordre fem servir
<xs:all>
Només pot contenir elements.
Les etiquetes dins de all
només poden sortir UN COP.
Una solució alternativa pot ser crear un tipus complexe amb la repetició
Podem definir o bé uns elements o bé uns altres
<xs:choice>
S'ha de tenir en compte que davant de cada decisió el processador ha de saber per quin camí ha de tirar.
No es poden fer coses com:
Si no té atributs també podria haver definit la etiqueta amb el tipus simple.
Definint-ne la llargada a zero.
Un element que pot contenir etiquetes i text es defineix amb
mixed="true"
.
XML
Podem definir els elements de forma global i després usar-los en les definicions de tipus
Això ens permetrà reutilitzar-los quan ens facin falta.
Si un grup d'elements surten varies vegades podem definir un grup.
S'han de definir al principi del fitxer.
Els atributs són elements simples que sempre estan dins de tipus complexes.
S'hi pot treballar igual que amb els elements:
A menys que es digui el contrari els atributs sempre són opcionals
Per fer-lo necessari hem de definir-lo amb use="required"
Perquè no es faci servir posem use="prohibited"
També existeix la opció use="optional" però realment és el comportament per defecte
Com amb les etiquetes podem definir valors per defecte, valors fixes i grups d'atributs
Per tant per definir els atributs d'aquest element:
XML
DTD
XSD
Podem trobat tots els tipus bàsics existents a