XML Schema
Són una sintàxi alternativa per a les DTDs. Utilitzen la sintàxi pròpia de XML Avantatges:
- Fàcils d'aprendre
- Suporten tipus de dades: numérics, dates...
- Procesables igual que els documents XML
Contents
- 1 Què hi ha a un esquema XML
- 2 Esquemes XML – elements schema
- 3 Esquemes XML – elements “simples”,tipus de dades
- 3.1 Restriccions - Enumeració
- 3.2 Restriccions - Pattern string
- 3.3 Restriccions - Pattern string
- 3.4 Restriccions - Pattern string
- 3.5 Restriccions - Pattern integer
- 3.6 Restriccions - Pattern string
- 3.7 Restriccions - Pattern string
- 3.8 Restriccions - Longitud string
- 3.9 Restriccions - Restriccions per valor
- 4 Declarar elements complexos
- 5 Atributs
- 6 Indicadors
Què hi ha a un esquema XML
Un esquema XML defineix la estructura válida per un tipus de document XML, es a dir defineix:
- Els elements que poden aparèixer al document.
- Els atributs que es poden utilitzar juntament a cada element.
- Com es poden niuar els elements (Pares i fills)
- L'ordre en el que apareixen els elements fills d'un mateix pare.
- El nombre permès dels elements fills
- Si un element pot ser buit o no.
- Tipus de dades per a elements i atributs.
- Valors per defecte i fixos per a elements i atributs.
Altres avantatges dels esquemes
- Més precisió que en les DTD en la definició de tipus de dades mitjançant formats i restriccions.
- Per exemple, en una data:
<date type="date">1999-03-11</date>- Els esquemes es defineixen com a documents XML. En un document a part amb l'extensió .xsd.
- Els documents XML es basen en aquest esquema, incluirem una referència a l'arxiu .xsd
Com associar esquemes a documents XML
<?xml version="1.0"?>
<note xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="note.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>
Don't forget me this weekend!
</body>
</note>Exemple esquema W3C
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema”>
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>Esquemes XML – elements schema
Els elements utilitzats en la creació d'un esquema “procedeixen” de l'espai de noms:
http://www.w3.org/2001/XMLSchemaL'element Schema es l'element arrel del document que defineix l'esquema:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
</xs:schema>Esquemes XML – elements “simples”
Un element simple és un element que només pot contenir text (qualsevol tipus de dada), però no altres elements ni atributs. Per a definir un element simple utilitzem la sintaxis:
<xs:element name="xxx" type="yyy"/>Exemples
<xs:element name=“apellido” type="xs:string"/>
<xs:element name=“edad" type="xs:integer"/>
<xs:element name=“fecNac" type="xs:date"/>Esquemes XML – elements “simples”,tipus de dades
Els tipus de dades més utilitzats són:
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
Un element simple pot tenir un valor per defecte I un valor “fixe”. S'indica mitjançant els atributs default I fixed:
<xs:element name="color" type="xs:string" default="red"/>Restriccions - Enumeració
<xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</xs:element>Restriccions - Pattern string
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>En aquest exemple, l'element “letter” ha de prendre com a valor una lletra minúscula.
Restriccions - Pattern string
<xs:element name="initials">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>En aquest exemple l'element “initials” ha de prendre com a valor 3 lletres majúscules o minúscules.
Restriccions - Pattern string
<xs:element name="choice">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[xyz]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>En aquest exemple, l'element “choice” ha de prendre com a valor una d'aquestes lletres: x, y o z
Restriccions - Pattern integer
<xs:element name="prodid">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>Restriccions - Pattern string
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="([a-z])*"/>
</xs:restriction>
</xs:simpleType>
</xs:element>Restriccions - Pattern string
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z0-9]{8}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>En aquest exemple, el valor del camp “password” ha de ser de 8 caràcters.
Restriccions - Longitud string
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>Els elements length, minLength y maxLength permeten indicar el número exacte, mínim i màxim de caràcters que pot tenir un valor d'un element.
Restriccions - Restriccions per valor
Si volem restringir un valor de l'xml, com per exemple que sigui més gran que 5, que sigui més petit que 2, etc... Podem utilitzar els element minInclusive, maxInclusive, minExclusive i maxExclusive. Per exemple, per declarar que volem que un valor tingui un valor superior o igual a 4, podriem especificar-ho:
<xs:element name="numRodes">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="4"/>
</xs:restriction>
</xs:simpleType>
</xs:element>So volguéssim especificar que el valor sigui més gran que 4 i mes petit o igual a 8:
<xs:element name="numRodes">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minExclusive value="4"/>
<xs:maxInclusive value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>Declarar elements complexos
Els elements complexos són aquells que dins seu contenen altres elements simples o complexos.
Donat un xml com per exemple:
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>Els elements complexos els podem declarar de dues maneres diferents:
- Dins del mateix element
En el moment de definir l'element complex, dins seu ja definim l'estructura del tipus complex.
<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>- Creant un tipus personalitzat
Podem definir un tipus complex personalitzat, i assignar a l'element que volem definir aquest tipus personalitzat que hem creat.
<xs:element name="employee" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>D'aquesta segona manera podem "reaprofitar" el tipus personalitzat que hem creat en diversos elements del nostre xml, de manera que el codi ens quedarà més curt i ben organitzat. Serà, per tant, la manera en la que declararem els tipus complexos en els nostres exercicis.
<xs:element name="employee" type="personinfo"/>
<xs:element name="student" type="personinfo"/>
<xs:element name="member" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>Atributs
Els elements que contenen atributs son considerats com elements complexos. Per tant la seva definició serà semblants a la d'un element complex afegint l'etiqueta xs:attribute.
Caldrà diferenciar entre tres diferents tipus d'elements complexes amb atributs:
- Element buit
En el següent xml:
<Author>
<Name>
<FirstName>Mark</FirstName>
<LastName>Twain</LastName>
</Name>
<HomePage URL="http://www.marktwain.com"/>
</Author>El codi XML Schema que validaria que l'element HomePage té un atribut URL seria els següent:
<xs:element name="HomePage">
<xs:complexType>
<xs:attribute name="URL" type="xs:anyURI"/>
</xs:complexType>
</xs:element>- Element simple
Si l'element a definir és de tipus simple com el següent:
<Author>
<Name Pseudonym="true" HomePage="http://www.nathanielhawthorne.com">
<FirstName Full="false">Nat</FirstName>
<LastName>Hawthorne</LastName>
</Name>
</Author>El codi XML Schema que validaria que l'element FirstName té un atribut Full seria:
<xs:element name="FirstName">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="Full" type="xs:boolean"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>- Element complex
Si l'atribut a validar es troba en un element de tipus complex, com per exemple:
<Author>
<Name Pseudonym="true" HomePage="http://www.marktwain.com">
<FirstName>Mark</FirstName>
<LastName>Twain</LastName>
</Name>
</Author>S'hauria de validar de la següent manera:
<xs:element name="Name">
<xs:complexType>
<xs:sequence>
<xs:element name="FirstName" type="xs:string"/>
<xs:element name="LastName" type="xs:string"/>
</xs:sequence>
<xs:attribute name="Pseudonym" type="xs:boolean"/>
<xs:attribute name="HomePage" type="xs:anyURI"/>
</xs:complexType>
</xs:element>Indicadors
En els exemples anteriors hem utilitzat l'element xs:sequence com element fill de l'element xs:complexType xs:sequence indica que els elements anidats dintre d'ell han d'apareixer en un ordre determinat. Altres opcions o indicadors són: xs:all y xs:choice
Indicador xs:all
L'indicador xs:all indica que els elements que conté poden aparèixer en cualsevol ordre però com a màxim una vegada.
<xs:element name="person">
<xs:complexType>
<xs:all>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>Indicador xs:choice
L'indicador xs:choice indica que pot aparèixer només un els delements que conté:
<xs:element name="person">
<xs:complexType>
<xs:choice>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>maxOccurs i minOccurs
Aquests indidcadors s'utilitzen per a indicar el nombre máxim I mínim de vegades que pot aparèixer un element fill d'un element compelx. L'atribut maxOccurs pot prendre el valor “unbounded”, que indica que no existeix cap limit.
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="full_name" type="xs:string"/>
<xs:element name="child_name" type="xs:string" maxOccurs="10"/>
</xs:sequence>
</xs:complexType>
</xs:element>