XML Schema (XSD)
Qué és XSD?
XML Schema Definition (XSD) és el sistema de validació de documents XML recomanat pel W3C (2001). A diferència del DTD, l'XSD és en si mateix un document XML, cosa que el fa més expressiu i compatible amb les eines XML.
Avantatges sobre DTD: - Suporta tipus de dades rics (integer, date, boolean, decimal...) - Suporta namespaces - Permet restriccions avançades (valors mínims/màxims, patrons regex) - Permet reutilització de components (types, groups) - És XML (es pot processar amb XSLT, XPath, etc.)
Estructura bàsica d'un XSD
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<!-- Declaració de l'element arrel -->
<xs:element name="biblioteca" type="BibliotecaType"/>
<!-- Definició de tipus -->
<xs:complexType name="BibliotecaType">
<xs:sequence>
<xs:element name="llibre" type="LlibreType"
minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- ... altres tipus ... -->
</xs:schema>
Associació XSD ↔ XML
<?xml version="1.0" encoding="UTF-8"?>
<biblioteca
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="biblioteca.xsd">
<!-- contingut... -->
</biblioteca>
Tipus simples predefinits
<!-- Tipus de dades comuns -->
<xs:element name="nom" type="xs:string"/>
<xs:element name="edat" type="xs:integer"/>
<xs:element name="preu" type="xs:decimal"/>
<xs:element name="actiu" type="xs:boolean"/>
<xs:element name="data" type="xs:date"/> <!-- AAAA-MM-DD -->
<xs:element name="hora" type="xs:time"/> <!-- HH:MM:SS -->
<xs:element name="dataHora" type="xs:dateTime"/> <!-- AAAA-MM-DDTHH:MM:SS -->
<xs:element name="url" type="xs:anyURI"/>
<xs:element name="id" type="xs:ID"/>
<xs:element name="ref" type="xs:IDREF"/>
Tipus simples amb restriccions
<!-- Restriccions sobre strings -->
<xs:simpleType name="CodiPostalType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{5}"/> <!-- exactament 5 dígits -->
<xs:length value="5"/>
</xs:restriction>
</xs:simpleType>
<!-- Restriccions numèriques -->
<xs:simpleType name="NotaType">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0.0"/>
<xs:maxInclusive value="10.0"/>
</xs:restriction>
</xs:simpleType>
<!-- Enumeració -->
<xs:simpleType name="GrauType">
<xs:restriction base="xs:string">
<xs:enumeration value="GM"/>
<xs:enumeration value="GS"/>
</xs:restriction>
</xs:simpleType>
<!-- Longitud de string -->
<xs:simpleType name="NomCurtType">
<xs:restriction base="xs:string">
<xs:minLength value="2"/>
<xs:maxLength value="50"/>
</xs:restriction>
</xs:simpleType>
Tipus complexos
Seqüència
<xs:complexType name="PersonaType">
<xs:sequence>
<xs:element name="nom" type="xs:string"/>
<xs:element name="cognom" type="xs:string"/>
<xs:element name="edat" type="xs:integer"
minOccurs="0"/> <!-- opcional -->
<xs:element name="email" type="xs:string"
minOccurs="0" maxOccurs="3"/> <!-- 0-3 vegades -->
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required"/>
<xs:attribute name="actiu" type="xs:boolean" default="true"/>
</xs:complexType>
Elecció
<xs:complexType name="PagamentType">
<xs:choice>
<xs:element name="targeta" type="TargetaType"/>
<xs:element name="transferencia" type="TransferenciaType"/>
<xs:element name="efectiu" type="xs:decimal"/>
</xs:choice>
</xs:complexType>
Contingut mixt (text + elements)
<xs:complexType name="ParagrafType" mixed="true">
<xs:sequence>
<xs:element name="em" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
Exemple complet: Institut
institut.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="institut" type="InstitutType"/>
<xs:complexType name="InstitutType">
<xs:sequence>
<xs:element name="nom" type="xs:string"/>
<xs:element name="adreca" type="xs:string"/>
<xs:element name="telefon" type="xs:string"/>
<xs:element name="cicle" type="CicleType"
minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="CicleType">
<xs:sequence>
<xs:element name="nom" type="xs:string"/>
<xs:element name="modul" type="ModulType"
minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="codi" type="xs:string" use="required"/>
<xs:attribute name="grau" type="GrauType" use="required"/>
</xs:complexType>
<xs:complexType name="ModulType">
<xs:sequence>
<xs:element name="nom" type="xs:string"/>
</xs:sequence>
<xs:attribute name="codi" type="xs:string" use="required"/>
<xs:attribute name="hores" type="xs:positiveInteger" use="required"/>
</xs:complexType>
<xs:simpleType name="GrauType">
<xs:restriction base="xs:string">
<xs:enumeration value="GM"/>
<xs:enumeration value="GS"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
Miniactivitat AC03739
Crea un XSD per al document biblioteca.xml del RA1. El XSD ha de validar: tipus de dades per a any (integer, rang 1000-2026), isbn (pattern com ISBN-xxx-xx-xxxxx-xx-x), idioma (enumeració: ca, es, en, fr), preu (decimal positiu).