XML Schema

45
Curso: XML, de los datos a la presentación Julio de 2005 CAPTIVA · www.captiva.es Modelos de documento (Schema)

description

explicación sobre XML Schema

Transcript of XML Schema

Page 1: XML Schema

Curso: XML, de los datos a la presentaciónJulio de 2005

CAPTIVA · www.captiva.es

Modelos de documento (Schema)

Page 2: XML Schema

Introducción

XML Schema Descripción formal de un documento XML en XML El más utilizado W3C XML Schema Otros Relax NG, Schematron Un XML documento que cumple con schema

instancia Métodos para asociar instancia a schema

Atributo xsi:schemaLocation lista de namespaces y schema para cada uno

Atributo xsi:noNamespaceSchemaLocation schema para elementos sin namespace

Otros prefijándoselo al parser, etc.

Page 3: XML Schema

Introducción (II)

Schema vs DTD Tipos de datos simples y complejos (en DTD PCDATA)

para contenido y atributos Derivación y herencia de tipos Declaración de elementos y atributos sensibles al namespace Schema no dispone de ENTITIES Más sencillo en DTD.

Alternativa Xinclude Namespaces

Especificación posterior a XML 1.0 No soportado por DTDs Uso Reutilización de nombres para diferentes contextos.

P.e. <nombre>Kiko</nombre> Nombre de persona, equipo, etc.

Los schemas combinan nombre con namespace

Page 4: XML Schema

Principios Ejemplo de XML (direccion.xml):

<?xml version="1.0"?><nombre

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="direccion-schema.xsd">Don Pimpón

</nombre> Ejemplo de Schema (direccion-schema.xsd):

<?xml version="1.0"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name=“nombre“ type="xs:string"/> </xs:schema>

Significado: El documento contiene elemento <nombre> y admite contenido de tipo

xs:string (xs namespace del propio schema). noNamespaceSchemaLocation No hemos definido un namespace para

nombre. Requiere hacer referencia al ns que lo define

Page 5: XML Schema

Principios (II) Cómo validamos nuestros ejemplos:

Editores Jedit, Cooktop Validadores MSV (MultiSchemaValidator), XSV

Organización del documento Elemento raíz <xs:schema> Hijo de elemento raíz Definición de elementos raíz para instancias XML

Anotaciones Elementos orientados a documentación del schema <xs:annotation> A su vez <xs:annotation> contiene <xs:documentation> (hombres) ó

<xs:appinfo> (máquinas, p.e. ayuda contextual) Ejemplo<xs:annotation>

<xs:documentation xml:lang=“es-es">Ejemplo de XML schema para <a href=“http://www.captiva.es/cursoxml/”> curso XML </a>

(c) 2005 Captiva Soluciones y Seguridad S.L. </xs:documentation>

</xs:annotation>

Page 6: XML Schema

Principios (III)

Declaración de elementos Formato

<xs:element name=“nombre-elemento" type=“tipo-contenido">

Tipos de contenidos Simples Tipos predefinidos Complejos Tipos definidos por el usuario<xs:element name=“nombre-elemento">

<xs:complexType><!-- Definición del tipo complejo --></xs:complexType>

</xs:element>

Page 7: XML Schema

Principios (IV)

Tipo Descripción

string Cadena unicode

normalizedString Cadena con tabuladores y cambios de linea normalizados a espacios

token Igual que anterior pero con multiples espacios substituidos por uno único y eliminados los iniciales y finales

Name Nombre XML

language Mismo valor que atributo xml:lang. P.e.: en, es-es

anyURI URI

boolean true | false | 0 | 1

byte 127 <= Entero >= -128

integer Número entero positivo o negativo

decimal Numero flotante de precisión arbitraria

base64Binary Datos binarios codificados Base64

dateTime Fecha y hora

duration Cantidad de tiempo relativa en años, días, meses, etc.

ID, IDREF, IDREFS, ENTITY, ENTITIES, NOTATION, NMTOKEN, NMTOKENS

Igual que XML DTD 1.0

Algunos tipos básicos

Page 8: XML Schema

Principios (V) Declaración de atributos

Siempre son tipos básicos no pueden contener elementos Pega Un elemento de tipo básico no puede tener atributos Se declaran mediante: <xs:attribute>

Posible definir atributos “globales” o locales a la definición de “complexType” de un elemento

Ejemplo<xs:element name=“nombre"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="language" type="xs:language"/> </xs:extension> </xs:simpleContent> </xs:complexType></xs:element>

Page 9: XML Schema

Principios (VI) Grupos de atributos

DTDs Parameter entities Definición de un xs:attributeGroup global identificado por id único name Dentro del complex type se hace referencia al attributeGroup Ejemplo:

<xs:attributeGroup name=“idioma"><xs:attribute name=“language” type=“xs:lang”/>

</xs:attributeGroup>

...<xs:element name=“nombre"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attributeGroup ref=“idioma"/> </xs:extension> </xs:simpleContent> </xs:complexType></xs:element>

Page 10: XML Schema

Namespaces Un namespace se identifica con una URL

Por abreviar se suele asignar un prefijo Hace referencia a elementos de ese namespace

El prefijo no identifica el namespace, es la URL ¿Cómo se asocia un Schema con un namespace?

Declaración tipica <xs:schema

xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace=“http://www.captiva.es”xmlns=“http://www.captiva.es”>

xmlns:xs = … Este documento usa namespace de XMLSchema (http://.../XMLSchema) y se usará el prefijo xs

targetNamespace = … Los elementos definidos en este schema pertenecen al namespace “http://www.captiva.es”

xmlns = … Identifica el namespace por defecto.

Page 11: XML Schema

Namespaces (II) ¿Cómo se asocia una instancia con un namespace?

Declaración tipica <nombre

xmlns:xsi="http://www.w3.org/2001/XMLSchema“ xsi:schemaLocation=“http://www.captiva.es

direccion.xsd”xmlns=“http://www.captiva.es”

elementFormDefault="qualified" >Yo mismo</nombre> xmlns:xsi = … XMLSchema en sí es una instancia XML. La

hacemos accesible a través de prefijo “xsi” xsi:schemaLocation = “schema fich-schema.xsd”

Token list con el schema a utilizar (debe coincidir con targetSchema) y fichero que contiene la def del schema

xmlns = … Identifica el namespace por defecto. elementFormDefault = “qualified” -> Los nombres simpre

son cualificados Evita errores

Page 12: XML Schema

Tipos Complejos Tipos complejos

Sólo para elementos Definición de nuevos tipos

xs:complexType Alternativas

Declaración global (fuera definición de cualquier elemento) Se puede referenciar a través de atributo name

Declaración dentro de definición de elementos Ejemplo:

<identificacion> <nombre>Fulano<nombre> <apellido1>de Tal</apellido1> <apellido2>y Cual</apellido2></identificacion>

<xs:element name=“identificacion”> <xs:complexType> <xs:sequence> <xs:element name=“nombre” type=“xs:string”/> <xs:element name=“apellido1” type=“xs:string”/> <xs:element name=“apellido2” type=“xs:string”/> </xs:sequence> </xs:complexType></xs:element>

Page 13: XML Schema

Tipos Complejos (II)

Restricción de ocurrencias Equivalente a modificadores de DTDs (+ * ?) Parámetros minOccurs y maxOccurs de xs:element Ejemplo:

<xs:element name=“apellido2” type=“xs:string” minOccurs=“0”/>

Alternativas para contenido de un elemento Vacío Contenido simple Contenido mixto Cualquier tipo

Page 14: XML Schema

Elementos vacíos

Elemento vacío <elemento /> ó <elemento></elemento> Ejemplo de elemento vacío <xhtml:img

src=“”/> Tipo complejo sin más elementos anidados Ejemplo definición de elemento img:

<xs:element name=“img“>

<xs:complexType>

<xs:attribute name=“src“ type="xs:anyURI"/>

</xs:complexType>

</xs:element>

Page 15: XML Schema

Elementos con contenido simple

Se especifican con modificador <xs:simpleContent/> Se permite definir tipos simples derivados de los que incorpora

Schema <xs:extension base=“tipo-simple"> Declaramos un tipo complejo con contenido simple y lo usamos

para definir el elemento “nombre” con atributo “dni”:<xs:element name=“nombre”>

<xs:complexType>

<xs:simpleContent>

<xs:extension base=“xs:string”/>

<xs:attribute name=“dni” type=“xs:ID”>

<xs:extension base=“xs:string”/>

</xs:complexType>

</xs:element>

</xs:element>

Page 16: XML Schema

Elementos con contenido simple (II)

Defininición de tipos simples En vez de definir tipo complejo con contenido simple podemos

definir tipo simple Ej:

<xs:simpleType name=“tipoMatricula">

<xs:restriction base="xs:string"/>

</xs:simpleType> Facetas

Son posibles valores para los tipos simples Para ello se emplean restricciones de valores xs:restriction

<xs:restriction base=“tipo-simple”>

<xs:nombre-faceta value=“valor-faceta”/>

</xs:restriction>

Page 17: XML Schema

Tipos simples: Facetas

Lista de posibles facetas length (o minLength y maxLength) pattern enumeration whiteSpace maxInclusive y maxExclusive minInclusive y minExclusive totalDigits fractionDigits

Page 18: XML Schema

Tipos simples: Facetas (II)

Espaciado Antes de “parsear” el dato se normalizan los

espacios Con whiteSpace podemos determinar cómo se

normalizan Posibles valores:

preserve Deja todos los espacios intactos replace Substituye \t \r \n por espacio (#x20) collapse Hace replace y luego substituye multiples

espacios por uno sólo

Page 19: XML Schema

Tipos simples: Facetas (III)

Longitud Tres alternativas:

length Fija longitud exacta permitida minLength Fija longitud mínima maxLength Fija longitud máxima

Ejemplo<xs:simpleType name=“tipoNombre"> <xs:restriction base="xs:string"> <xs:minLength value=“3"/> <xs:maxLength value=“15"/> </xs:restriction> </xs:simpleType>

Ejemplo direccion-tipobasico.xml y direccion-schema-tipobasico.xsd

Page 20: XML Schema

Tipos simples: Facetas (IV)

Enumeraciones Lista de valores válidos (DTD (a | b | c) )

<xs:simpleType name=“tipoMoneda">

<xs:restriction base="xs:string">

<xs:enumeration value=“cara"/>

<xs:enumeration value=“cruz"/>

</xs:restriction>

</xs:simpleType>

Page 21: XML Schema

Tipos simples: Facetas (V)

Restricciones numéricas Rangos: minInclusive (<=) , minExclusive

(<), maxInclusive (>=), maxExclusive (>) Control de valores decimales: totalDigits,

fractionDigits• Ejemplo restricción decimal a XXX.XX

<xs:simpleType name=“tipoPrecio"> <xs:restriction base="xs:decimal"> <xs:totalDigits value=“5"/> <xs:fractionDigits value=“2"/> </xs:restriction> </xs:simpleType>

Page 22: XML Schema

Tipos simples: Facetas (VI) Formato específico de cadenas

Se utiliza <xs:pattern> para especificar el patrón que ha se seguir la cadena

Algunos ejemplos de patrones: [a-z] Letras de la ‘a’ a la ‘z’ \d Dígito numérico \D Cualquier carácter que no sea un dígito . Cualquier carácter excepto CR LF \s Espacio, tabulador o CR o LF

Más información: http://www.w3.org/TR/xmlschema-2/#regexs Ejemplo definición tipo DNI:

<xs:simpleType name=“tipoDNI"> <xs:restriction base="xs:string"> <xs:pattern value=“\d\d\d\d\d\d\d\

d[TRWAGMYFPDXBNJZSQVHLCKEF]"/> </xs:restriction> </xs:simpleType>

Page 23: XML Schema

Tipos simples: Facetas (VII)

Listas Lista de elementos de tipo básico separados por

espacios Sintaxis:

<xs:list itemType=“tipo-basico"> Atención: No va dentro de restriction. Se pueden aplicar restricciones que se aplican a

todos los elementos Ejemplo lista de DNIs:

<xs:simpleType name=“tipoListaDNI"> <xs:list itemType=“tipoDNI"></xs:simpleType>

Page 24: XML Schema

Tipos simples: Facetas (VIII)

Uniones Alternativa entre varios tipos posibles Sintaxis:

<xs:union memberTypes=“tipo-basico1 tipo-basico2">

Atención: No va dentro de restriction Ejemplo:

<xs:simpleType name=“textoOentero">

<xs:union memberTypes=“xs:integer xs:string">

</xs:simpleType>

Page 25: XML Schema

Elementos con contenido mixto

Contenido mixto Texto y elementos DTD Número ilimitado de combinación texto

elementos <!ELEMENT raiz (hijo | #PCDATA)*>

Schema Además control del número y secuencia de elementos

mezclados con texto ¿Cómo se permite contenido mixto?

<xs:element name=“detodounpoco"> <xs:complexType mixed="true"> <!-- Definicion del tipo --> </xs:complexType></xs:element>

Page 26: XML Schema

Elementos con contenido mixto (II)

Mezclado de texto con secuencia de elementos Ejemplo: carta.xml y carta-schema.xsd

Ejercicio: Abrir carta.xml y validar. Después cambiar en xsd mixedContent=“false” y repetir.

<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.captiva.es" xmlns="http://www.captiva.es" elementFormDefault="qualified"> <!-- Definicion de elementos --> <xs:element name="carta"> <xs:complexType mixed="true"> <xs:sequence> <xs:element name="saludo" type="xs:string"/> <xs:element name="cuerpo" type="xs:string"/> <xs:element name="despedida" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>

Page 27: XML Schema

Elementos con contenido mixto (II)

Mezclado de texto con elementos alternativos En vez de mezclar con <xs:sequence> utilizamos

<xs:choice> Ejemplo

<xs:element name=“saludo”>

<xs:complexType mixed="true">

<xs:choice>

<xs:element name="hola"/>

<xs:element name=“estimado"/>

<xs:element name=“querido"/>

</xs:choice>

</xs:complexType>

</xs:element>

Page 28: XML Schema

Elementos con contenido mixto (III)

Mezclado de texto con secuencias desordenadas Se utiliza la construcción <xs:all> Implica que todos los elementos han de estar presentes pero en cualquier

orden Ejemplo

<xs:element name=“pedido”> <xs:complexType mixed="true"> <xs:all> <xs:element name=“fruta"/> <xs:element name=“hortaliza"/> <xs:element name=“legumbre"/> </xs:all> </xs:complexType></xs:element>

Fragmento XML que es válido de acuerdo al schema<pedido>Puedes traerme 3 kg de <legumbre>alubias</legumbre>, unos 5 kg de <hortaliza>pimientos</hortaliza> y quizá también 8 kg de <fruta>naranjas</fruta></pedido>

Page 29: XML Schema

Elementos con contenido mixto (IV)

Una vuelta más de tuerca: Agrupaciones Utlizando la construcción <xs:group> podemos combinar <xs:sequence> <xs:choice> y

<xs:all> Ejemplo

<xs:element name=“menu”> <xs:complexType mixed="true"> <xs:group> <xs:all> <xs:element name=“canapes"/> <xs:element name=“ibericos"/> <xs:element name=“pate"/> </xs:all> <xs:sequence> <xs:element name=“carne"/> <xs:element name=“pescado"/> <xs:element name=“marisco"/> </xs:sequence> <xs:choice> <xs:element name=“tarta"/> <xs:element name=“helado"/> </xs:choice> </xs:group> </xs:complexType></xs:element>

Page 30: XML Schema

Cualquier contenido

Cualquier elemento, incluso de schemas externos Sintaxis: <xs:any> Cualquier elemento Ejemplo podemos incluir texto XHTML dentro de nuestro doc. XML:

<xs:element name=“textoXHTML" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:any namespace="http://www.w3.org/1999/xhtml“ minOccurs="0" maxOccurs="unbounded“ processContents="skip"/> </xs:sequence> </xs:complexType> </xs:element>

Page 31: XML Schema

Cualquier contenido (II)

Inclusión de declaraciones en ficheros externos Sintaxis: <xs:include schemaLocation=“otro-schema.xsd”> El fichero incluido no es un fragmento es un schema completo Para utlizar elementos definidos externamente Utilizar correctamente

namespaces Ejemplos:

carta-partida.xml se valida contra carta-partida-schema.xsd que incluye carta-partida-include-schema.xsd , donde se define el tipo tipoCarta

carta-partida-schema.xsd<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.captiva.es" xmlns="http://www.captiva.es" elementFormDefault="qualified"> <xs:annotation> <xs:documentation> Incluimos de "carta-partida-include-schema.xsd" Allá se define "tipocarta" </xs:documentation> </xs:annotation> <xs:include schemaLocation="carta-partida-include-schema.xsd"/> <xs:element name="carta" type="tipoCarta"/> </xs:schema>

Page 32: XML Schema

Cualquier contenido (III)

Inclusión de definiciones de otros namespaces Para ello utilizamos namespace

<xs:import namespace="http://www.w3.org/2001/03/XMLSchema/TypeLibrary" schemaLocation="http://www.w3.org/2001/03/XMLSchema/TypeLibrary.xsd"/>

Redefinición de tipos de otros schemas Se utiliza <xs:redefine schemaLocation=anyURI> Funciona como <xs:include> pero adicionalmente permite redefinir tipos Ejemplo, redefinimos tipoCarta (secuencia con saludo, cuerpo, despedida):<xs:redefine schemaLocation=“carta-partida-include-schema.xsd"> <xs:complexType name=“tipoCarta"> <xs:complexContent> <xs:extension base=“tipoCarta"> <xs:sequence> <xs:element name=“firma"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType></xs:redefine>

Page 33: XML Schema

Derivación de tipos complejos

Alternativas para derivar tipos complejos Por extensión <xs:extension>

Equivale a añadir contenidos a los contenidos de la declaración base

Ej. Añadimos código postal a tipoDireccionFisica para formar el nuevo tipo tipoDireccionPostal

<xs:complexType name=“tipoDireccionPostal"> <xs:complexContent> <xs:extension base=“tipoDireccionFisica"> <xs:sequence> <xs:element name=“CP“ type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType>

Page 34: XML Schema

Derivación de tipos complejos

Alternativas para derivar tipos complejos (II) Por restricción <xs:restriction>

Si el tipo derivado es subtipo del original Con tipos simples es sencilla su utilización (facets) Con tipos complejos hay que volver a definir el tipo base

eliminando los elementos o atributos que deseamos restringir

<xs:complexType nombre=“tipoNombreCompleto”> <xs:sequence> <xs:element name=“nombre” type=“xs:string”/> <xs:element name=“apellido1” type=“xs:string”/> <xs:element name=“apellido2” type=“xs:string”/> </xs:sequence></xs:complexType>

<xs:complexType nombre=“tipoNombreCorto”> <xs:complexContent> <xs:restriction base=“tipoNombreCompleto”/> <xs:sequence> <xs:element name=“nombre” type=“xs:string”/> <xs:element name=“apellido1” type=“xs:string”/> </xs:sequence> </xs:restriction> </xs:complexContent></xs:complexType>

Page 35: XML Schema

Derivación de tipos complejos (II)

Polimorfismo Característica interesante de tipos derivados Permite instanciar objetos derivados como si fueran hijos. El atributo xsi:type permite especificar a qué tipo derivado

conforma una instancia. Ejemplo:

<nombreCompleto

xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.captiva.es nombre.xsd“

xmlns=http://www.captiva.es

xsi:type=“tipoNombreCorto”>

<nombre>Pedro</nombre>

<apellido1>Ruiz</apellido1>

</nombreCompleto>

Page 36: XML Schema

Derivación de tipos complejos (III)

Grupos de substitución Mediante el atributo substitutionGroup de

<xs:element> podemos crear formas de llamar al mismo elemento con otro nombre.

Ejemplo trozo schema:<xs:element name=“calle” type=“xs:string”/>

<xs:element name=“Strasse” substitutionGroup=“calle”/>

Serían igualmente válidos:<calle>Madrid 43</calle>

<Strasse>Berlin 34</Strasse>

Page 37: XML Schema

Control sobre derivación

Elementos y tipos abstractos Si atributo abstract=true en definición de elemento o tipo

No puede instanciarse el mismo Atributo final

Si atributo final de complexType puede tener los valores #all, extension, restriction para restringir la derivación. P.e.: <xs:complextType name=“nombre” final=“extension”>

Evita que se derive por extension este tipo

Facetas fijas Algunas facetas admiten atributo fixed=“true” Evita que futuras derivaciones anulen la restricción impuesta

por ella<xs:maxInclusive fixed="true" value="100">

Page 38: XML Schema

Control sobre derivación (II) Valores únicos

El elemento xs:unique permite definir valores únicos para elementos y atributos.

Funcionamiento Se utiliza una expresión xpath para coger subcojunto del documento xs:selector Se utiliza otra expresión xpath para seleccionar el campo determinado dentro de

subgrupo xs:field Si dos campos son iguales se genera un error

Ejemplo. Vamos a limitar en “contactos” contactos con mismo nombre:

<xs:complexType name=“tipoContactos”> <element “contacto” type=“tipoNombreCompleto” maxOccurs=10/></xs:complexType>

<xs:element name=“contactos" type=“tipoContactos"> <xs:unique name=“nombre"> <xs:selector xpath=“contactos"/> <xs:field xpath=“nombre"/> </xs:unique> </xs:element>

Page 39: XML Schema

Control sobre derivación (III)

Claves Igual que xs:unique pero no pueden ser nulas y se crean con xs:key

Referencias Con xs:keyref puede referenciarse una clave definida previamente Ejemplo:

Definimos clave única nombre del personaje Definimos campo “amigo-de” que debe apuntar a un nombre de personaje

<xs:key name=“nomPersonaje”> <xs:selector xpath=“personaje”/> <xs:field xpath=“nombre”/></xs:key>

<xs:keyref name=“nomPersonajeRef” refer=“nomPersonaje”> <xs:selector xpath=“personaje”/> <xs:field xpath=“amigo-de”/></xs:key>

<personaje> <nombre>Mortadelo</nombre> <amigo-de>Filemón Pi</amigo-de> <rasgos>camaleónico</rasgos></personaje>

Page 40: XML Schema

Ejemplo: articulo

Articulo-schema.xsd (1/3):

<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <!-- RaÃz --> <xs:element name="articulo"> <xs:complexType> <xs:sequence> <xs:element name="titulo"/> <xs:element name="subtitulo" minOccurs="0"/> <xs:element name="autor" minOccurs="0" maxOccurs="unbounded"/> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="parrafo"/> <xs:element name="lista"/> </xs:choice> <xs:element name="bibliografia" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element>

Page 41: XML Schema

Ejemplo: articulo (II)

Articulo-schema.xsd (2/3): <xs:element name="autor" type="xs:string"/> <xs:element name="bibliografia"> <xs:complexType> <xs:sequence> <xs:element name="recurso" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="itemlista" type="xs:string"/> <xs:element name="lista"> <xs:complexType> <xs:sequence> <xs:element name="itemlista" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="tipo" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="numerada"/> <xs:enumeration value="nonumerada"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element>

Page 42: XML Schema

Ejemplo: articulo (II)

Articulo-schema.xsd (3/3): <xs:element name="parrafo"> <xs:complexType mixed="true"> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element name="referencia"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="recurso"> <xs:complexType mixed="true"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="id" type="xs:ID" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="referencia"> <xs:complexType mixed="true"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="idref" type="xs:IDREF" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="subtitulo" type="xs:string"/> <xs:element name="titulo" type="xs:string"/> </xs:schema>

Page 43: XML Schema

Ejercicio (1/3) Partir de casino.xml de 2º capítulo y modificarlo ligeramente

Añadir un elemento a cada jugador (detrás de las cartas):

<apuesta moneda=“€”>12.23

</apuesta>

Añadir al elemento “jugador” un atributo “dni” con el formato visto en los ejemplos

Crear un XML Schema que permita verificar el fichero casino.xml. Para crearlo ir definiendo primero tipos simples y luego tipos complejos De tal forma que no sea necesario definir tipos complejos dentro de

elementos La última línea del fichero ha de ser de la forma:

<xs:element name=“casino” type=“tipoCasino”/>

Page 44: XML Schema

Ejercicio (2/3) Tipos simples a ir definiendo en orden:

tipoCadena xs:string que “colapsa” espacios

tipoNombreCarta Derivada de tipoCadena con valores: “As”, “Dos”, … ”Rey”

tipoPalo “oros”, “copas”, “espadas”, “bastos”

tipoDNI Copiar de ejemplo

tipoJuego “brisca”, “tute”, “poker”, “mus”

tipoMoneda “€”, “$”

tipoValorDinero Decimal con 2 números decimales máximo

Page 45: XML Schema

Ejercicio (3/3) Tipos complejos (Nota Todos los atributos han de tener atributo

use=“required”) tipoCarta

Contenido: Simple de tipo “tipoNombreCarta” Atributos: “palo” de tipo “tipoPalo”

tipoDinero Contenido: Simple de tipo “tipoValorDinero” Atributos: “moneda” de tipo “tipoMoneda”

tipoJugador Contenido: Secuencia de “nombre”, “carta” (1-10), “apuesta” Atributos: “dni” de tipo “tipoDNI”

tipoMesa Contenido: Secuencia de “jugador” (2-infinito) Atributos: “juego” de tipo “tipoJuego”

tipoCasino Contenido: Secuencia de “bienvenida”, ”mesa” (1-infinito) Restricciones: El atributo “dni” de cada jugador es una clave única

xs:key Hacer pruebas sobre casino.xml (poner apuestas sin tipo de moneda, poner

formato incorrecto en campos, repetir DNIs, etc…)