Salta el contingut

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