Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Introduccin
XML Schema
Descripcin formal de un documento XML en XML El ms utilizado W3C XML Schema Otros Relax NG, Schematron Un XML documento que cumple con schema instancia Mtodos 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 prefijndoselo al parser, etc.
Introduccin (II)
Schema vs DTD
Tipos de datos simples y complejos (en DTD PCDATA) para contenido y atributos Derivacin y herencia de tipos Declaracin de elementos y atributos sensibles al namespace Schema no dispone de ENTITIES Ms sencillo en DTD. Alternativa Xinclude
Namespaces
Especificacin posterior a XML 1.0 No soportado por DTDs Uso Reutilizacin de nombres para diferentes contextos. P.e. <nombre>Kiko</nombre> Nombre de persona, equipo, etc. Los schemas combinan nombre con namespace
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 Pimpn </nombre>
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
Principios (II)
Anotaciones
Elementos orientados a documentacin del schema <xs:annotation> A su vez <xs:annotation> contiene <xs:documentation> (hombres) <xs:appinfo> (mquinas, 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>
Principios (III)
Declaracin de elementos
Formato
<xs:element name=nombre-elemento" type=tipocontenido">
Tipos de contenidos
Simples Tipos predefinidos Complejos Tipos definidos por el usuario <xs:element name=nombre-elemento"> <xs:complexType> <!-- Definicin del tipo complejo --> </xs:complexType> </xs:element>
Principios (IV)
Algunos tipos bsicos
Tipo string normalizedString token Name language anyURI boolean byte integer decimal base64Binary dateTime duration ID, IDREF, IDREFS, ENTITY, ENTITIES, NOTATION, NMTOKEN, NMTOKENS Cadena unicode Cadena con tabuladores y cambios de linea normalizados a espacios Igual que anterior pero con multiples espacios substituidos por uno nico y eliminados los iniciales y finales Nombre XML Mismo valor que atributo xml:lang. P.e.: en, es-es URI true | false | 0 | 1 127 <= Entero >= -128 Nmero entero positivo o negativo Numero flotante de precisin arbitraria Datos binarios codificados Base64 Fecha y hora Cantidad de tiempo relativa en aos, das, meses, etc. Igual que XML DTD 1.0 Descripcin
Principios (V)
Declaracin de atributos
Siempre son tipos bsicos no pueden contener elementos Pega Un elemento de tipo bsico no puede tener atributos Se declaran mediante: <xs:attribute>
Posible definir atributos globales o locales a la definicin 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>
Principios (VI)
Grupos de atributos
DTDs Parameter entities Definicin 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>
Namespaces
Namespaces (II)
Cmo se asocia una instancia con un namespace?
Declaracin 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 travs 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
Tipos Complejos
Tipos complejos
Slo para elementos
Ejemplo:
<identificacion> <nombre>Fulano<nombre> <apellido1>de Tal</apellido1> <apellido2>y Cual</apellido2> </identificacion>
Restriccin de ocurrencias
Equivalente a modificadores de DTDs (+ * ?) Parmetros minOccurs y maxOccurs de xs:element
Ejemplo:
<xs:element name=apellido2 type=xs:string minOccurs=0/>
Elementos vacos
Elemento vaco
<elemento /> <elemento></elemento> Ejemplo de elemento vaco <xhtml:img src=/> Tipo complejo sin ms elementos anidados Ejemplo definicin de elemento img:
<xs:element name=img> <xs:complexType> <xs:attribute name=src type="xs:anyURI"/> </xs:complexType> </xs:element>
Espaciado
Antes de parsear el dato se normalizan los espacios Con whiteSpace podemos determinar cmo 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 slo
Longitud
Tres alternativas:
length Fija longitud exacta permitida minLength Fija longitud mnima maxLength Fija longitud mxima
Ejemplo
<xs:simpleType name=tipoNombre"> <xs:restriction base="xs:string"> <xs:minLength value=3"/> <xs:maxLength value=15"/> </xs:restriction> </xs:simpleType>
Enumeraciones
Lista de valores vlidos (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>
Restricciones numricas
Rangos: minInclusive (<=) , minExclusive (<), maxInclusive (>=), maxExclusive (>) Control de valores decimales: totalDigits, fractionDigits Ejemplo restriccin 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>
Listas
Lista de elementos de tipo bsico separados por espacios Sintaxis:
<xs:list itemType=tipo-basico">
Atencin: 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>
Uniones
Alternativa entre varios tipos posibles Sintaxis:
<xs:union memberTypes=tipo-basico1 tipobasico2">
Contenido mixto Texto y elementos DTD Nmero ilimitado de combinacin texto elementos
<!ELEMENT raiz (hijo | #PCDATA)*>
Schema
Adems control del nmero y secuencia de elementos mezclados con texto
Cualquier contenido
<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>
carta-partida-schema.xsd
<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>
<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>
<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>
Polimorfismo
Caracterstica 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>
Grupos de substitucin
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/>
Atributo final
Si atributo final de complexType puede tener los valores #all, extension, restriction para restringir la derivacin.
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 restriccin impuesta por ella
<xs:maxInclusive fixed="true" value="100">
Valores nicos
El elemento xs:unique permite definir valores nicos para elementos y atributos. Funcionamiento
Se utiliza una expresin xpath para coger subcojunto del documento xs:selector Se utiliza otra expresin xpath para seleccionar el campo determinado dentro de subgrupo xs:field Si dos campos son iguales se genera un error
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>
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"> <!-- Raz --> <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>
Ejercicio (1/3)
</apuesta> Aadir al elemento jugador un atributo dni con el formato visto en los ejemplos
Ejercicio (2/3)
tipoNombreCarta tipoPalo
tipoDNI
tipoJuego tipoMoneda
tipoValorDinero
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)