You are on page 1of 42

TEMA 5.

Esquemas y vocabularios XML

XML Schemas

Mecanismo para comprobar la validez de los documentos XML Misma funcin que los DTD. Diferencias:

Los esquemas son documentos XML, por lo que a su vez se puede comprobar si estn bien formados. Extenso catlogo de tipos de datos predefinidos que pueden ser empleados para crear nuevos tipos. Permiten concretar con precisin la cardinalidad de los elementos. Permite mezclar distintos vocabularios mediante espacios de nombres. Ms difciles de escribir e interpretar que los DTD, y suelen ser ms largos

Almacenados en archivos .XSD

Ejemplo 1: XML Schema


<?XML version="1.0"> <libro isbn="123456"> <ttulo>El Aleph</ttulo> <autor>J. L. Borges</autor> <ao>1946</ao> <precio>1560</precio> </libro>
El

DTD correspondiente es:


libro (ttulo, autor+, ao?, precio)> ttulo (#PCDATA)> autor (#PCDATA)> ao (#PCDATA)> (entero positivo, mayor de 1900) precio (#PCDATA)> (non-negative integer) libro isbn ID #REQUIRED>

<!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ATTLIST

<schema targetNamespace='http://www.ac.upc.es/aad/libro' Espacio de xmlns='http://www.w3.org/2001/XMLSchema'> nombres <simpleType name='linea'> <restriction base='string'> <maxLength value='50'/> </restriction> </simpleType> <simpleType name='sigloXX'> <restriction base='integer'> <minInclusive value='1900'/> <maxInclusive value='1999'/> </restriction> Raz </simpleType> <element name='libro' type='TipoLibro'/> <complexType name='TipoLibro'> <sequence> <element name='titulo' type='linea'/> <element name='autor' type='linea'/> <element name='anyo' type='sigloXX'/> <element name='precio' type='decimal'> <complexType> <attribute name='divisa' type='string'/> </complexType> </element> </sequence> <attribute name='isbn' type='ID'/> </complexType> </schema>

De DTD a Schema
<!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT address company name street city state zip phone (company?, name, street, city, state, zip, phone+)> (#PCDATA)> (#PCDATA)> (#PCDATA)> (#PCDATA)> (#PCDATA)> (#PCDATA)> (#PCDATA)>

schema en XML
<elementType name="address" > <sequence> <elementType name="company" minOccur="0" maxOccur ="1"/> <elementType name="name" minOccur="1" maxOccur ="1"/> <elementType name="street" minOccur="1" maxOccur ="1"/> <elementType name="city" minOccur="1" maxOccur ="1"/> <elementType name="state" minOccur="1" maxOccur ="1"/> <elementType name="zip" minOccur="1" maxOccur ="1"/> <elementType name="phone" minOccur="1" maxOccur ="5"/> <sequence> </elementType>

Reglas
* + ? , | X minOccurrs=0 maxOcurrs=unbounded minOccurrs=1 maxOcurrs=unbounded minOccurrs=0 maxOcurrs=1 xsd:sequence xsd:choice xsd:element

Vincular un Schema a un documento XML


<elemento xmlns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:schemaLocation="http://www.w3schools.com note.xsd> </elemento>

Contenido bsico del schema

El espacio de nombres del XMLSchema es usualmente xsd:


<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

Schema es el elemento raz del documento

Definir un elemento simple


Slo puede contener texto (cualquier tipo de dato) pero no otros elementos ni atributos Se define como donde name es el nombre del elemento Los valores ms comunes de tipos de datos ( type) son xsd:boolean xsd:integer xsd:date xsd:string xsd:decimal xsd:time Otros atributos: default="default value" si no se especifica otro valor fixed="value" no se puede especificar otro valor Ejemplo: <xsd:element name="apellido" type="xsd:string"/>

<xsd:element name="name" type="type" />

Definir un atributo

Los atributos se declaran: <xsd:attribute name="name" type="type" /> Donde:

name y type es igual que en xs:element

Otros atributos:
default="default value" si no se especifica otro valor fixed="value" no se puede especificar otro valor use="optional" el atributo no es obligatorio (por defecto) use="required" el atributo debe estar presente Ejemplo: <xsd:attribute name=idioma" type="xsd:string"/>

Definicin de tipos

De los tipos bsicos pueden derivarse nuevos tipos, simples o complejos. Los tipos simples contienen texto y se definen mediante xsd:simpleType
<xsd:element name=nombre type=xsd:string/> <xsd:attribute name=identificacion type=xsd:ID/>

y los complejos Pueden contener cualquier combinacin de contenido de elementos , informacin de caracteres y atributos y se definen con xsd:complexType

Restricciones
Permiten

restringir el valor que se le puede dar a un elemento o atributo XML. Tipos:


Sobre valores Sobre un conjunto de valores Sobre series de valores Sobre espacios en blanco

Restricciones sobre valores

La forma general de establecer una restriccin sobre un valor es: <xs:element name="name"> (o xs:attribute)
<xs:restriction base="type"> ... Las restricciones ... </xs:restriction> </xs:element>

Por ejemplo:

<xs:element name=edad"> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"> <xs:maxInclusive value="140"> </xs:restriction> </xs:element>

Restricciones sobre un conjunto de valores: Enumeration


Restringe el valor a un conjunto de valores Ejemplo:

<xs:element name=estacion"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value=primavera"/> <xs:enumeration value=verano"/> <xs:enumeration value=otoo"/> <xs:enumeration value=invierno"/> </xs:restriction> </xs:simpleType> </xs:element>

Restricciones sobre series de valores

Para limitar el contenido del elemento xml definiendo las series de nmeros y letras que se pueden usar usaremos patrones:
<xs:element name="letra"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-z]"/> </xs:restriction> </xs:simpleType> </xs:element>

Restricciones sobre espacios en blanco

whiteSpace dice lo que hay que hacer con los espacios en blanco value="preserve" Mantiene los espacios en
blanco como estn

value="replace"

Campia los espacios en blanco (saltos, tab) por espacios

value="collapse"

Reemplaza todas las secuencias de espacios en blanco por un slo espacio en blanco

Restricciones en nmeros

minInclusive nmero debe ser value minExclusive -- nmero debe ser > value maxInclusive -- nmero debe ser value maxExclusive -- nmero debe ser < value totalDigits -- nmero debe tener exactamente value dgitos fractionDigits nmero no debe tener ms de value dgitos despus del punto decimal.

Restricciones en strings

length el string debe contener exactamente value caracteres minLength el string debe contener al menos value caracteres maxLength el string no debe contener ms de value caracteres pattern el value es una expresin regular que el string debe cumplir

Elementos complejos

Elementos que contienen otros elementos hijo o que tienen atributos. Se suelen dividir en 4 tipos:

Elementos vacos Elementos no vacos con atributos Elementos con elementos hijos Elementos con elementos hijos y con texto o valor propio

Ejemplos de elementos complejos


<product pid="1345"/> <comida tipo=postre>helado</comida> <descripcion>Sucedi el <date>03.03.99</date></descripcion> <empleado> <nombre>Manuel</nombre> <apellidos>Suarez</apellidos> </empleado>

Sintaxis

Se definen como:
<xs:element name="name"> <xs:complexType> ... </xs:complexType> </xs:element>

Ejemplo:
<xsd:element name="empleado"> <xsd:complexType> <xsd:sequence> <xsd:element name="nombre" type="xsd:string"/> <xsd:element name="apellidos" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element>

Segunda versin

Tambin podremos usar la siguiente sintaxis si queremos usar el tipo en ms de un elemento:


<xsd:element name="empleado" type="personainfo"/> <xsd:element name="estudiante" type="personainfo"/> <xsd:element name="miembro" type="personainfo"/> <xsd:complexType name="personainfo"> <xsd:sequence> <xsd:element name="nombre" type="xsd:string"/> <xsd:element name="apellido" type="xsd:string"/> </xsd:sequence> </xsd:complexType>

Extensin y derivacin

Un tipo complejo puede estar basado en otro tipo complejo

<xs:complexType name="newType"> <xs:complexContent> <xs:extension base="otherType"> ...cosas nuevas... </xs:extension> </xs:complexContent> </xs:complexType>

Ejemplo de extensin
Definir un tipo complejo que se adapte a la direccin postal para Estados Unidos, asumiendo que ya hay definido un tipo Direccin: <xs:complexType name=USADireccion"> <xs:complexContent> <xs:extension base=tipo:Direccion"> <sequence> <element name=estado type=USAEstado/> <element name=codigopostal type=positiveInteger/> </sequence> </xs:extension> </xs:complexContent> </xs:complexType>

Herencia
<xsd:element name="empleado" type="fullpersonainfo"/> <xsd:complexType name="personainfo"> <xsd:sequence> <xsd:element name="nombre" type="xsd:string"/> <xsd:element name="apellido" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="fullpersonainfo"> <xsd:complexContent> <xsd:extension base="personainfo"> <xsd:sequence> <xsd:element name="direccion" type="xsd:string"/> <xsd:element name="ciudad" type="xsd:string"/> <xsd:element name="pais" type="xsd:string"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType>

Elementos vacos con atributos

Los elementos vacos son complejos


<xsd:element name="producto"> <xsd:complexType> <xsd:attribute name="prodid" type="xsd:positiveInteger"/> </xsd:complexType> </xsd:element>

Elementos de texto con atributos


<xsd:element name="shoesize"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:integer"> <xsd:attribute name="country" type="xsd:string" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element>

Elementos mixtos

Pueden contener texto y elementos Se aade mixed="true" al elemento xs:complexType El texto no se menciona en el elemento y puede ir en cualquier sitio (bsicamente se ignora)

<xs:complexType name="paragraph" mixed="true"> <xs:sequence> <xs:element name="someName type="xs:anyType"/> </xs:sequence> </xs:complexType>

Indicadores

De Orden:

En un determinado orden o secuencia: sequence Pudiendo el autor del documento escoger alguno de los elementos del grupo: choice Dar al autor total libertad tanto respecto al orden como a la seleccin de elementos: all

De ocurrencias: cardinalidades

xs:sequence
Elementos que contienen elementos
<xsd:element name="persona"> <xsd:complexType> <xsd:sequence> <xsd:element name= " nombre" type="xsd:string" /> <xsd:element name= " apellido" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element>

xs:choice
Elementos que contienen alternativa de elementos
<xs:element name=transporte"> <xs:complexType> <xs:choice> <xs:element name= " tren" type="xs:string" /> <xs:element name= " avion" type="xs:string" /> <xs:element name= " coche" type="xs:string" /> </xs:choice> </xs:complexType> </xs:element>

xs:all
xs:all permite a los elementos aparecer en cualquier orden <xsd:element name="person"> <xsd:complexType> <xsd:all> <xsd:element name= "nombre" type="xsd:string" /> <xsd:element name= "apellidos" type="xsd:string" /> </xsd:all> </xsd:complexType> </xsd:element>

Cardinalidades
minOccurs y maxOccurs Se utilizan para indicar el nmero mximo y mnimo de veces que puede aparecer un elemento hijo de un elemento complejo

minOccurs=0: Opcionalidad maxOccurs = unbounded: no existe valor lmite

Ejercicio

Transforma el modelo de contenido

(a|(b, c?))*
en una definicin mediante XMLSchema

Solucin
<complexType> <choice minOccurs=0 maxOccurs=unbounded> <element ref=a/> <sequence> <element ref=b/> <element ref=c maxOccurs=1/> </sequence> </choice> </complexType>

minOccurs=0

Completar el documento Esquema

Generalizacin de comentarios:

annotation: mecanismo para documentar los componentes de un esquema, haciendo una funcin similar a los comentarios appinfo: proporciona informacin a otras aplicaciones, lo que supone un procesamiento externo al propio documento documentation: texto o referencia a texto dentro del elemento annotation

Ejemplo
<xsd:complexType nombre=elemento> <xsd:annotation> <xsd:documentation>este elemento es .. </xsd:documentation> </xsd:annotation> </xsd:complexType>

Primitivas de un Schema

schema: es el elemento root. annotation: pone comentarios al complexType. Primitivas appinfo y documentation. complexType: equivalente a una combinacin de atributos y la lista de elementos que estn entre parntesis en una declaracin de una DTD. element:define un elemento y utiliza ciertos atributos adicionales.

Type attribute: asocia un tipo simple o complejo a un elemento. minOcurrs y maxOcurrs: especifica la cantidad mxima y mnima que un elemento ocurre.

Primitivas de un Schema (2)

attribute: elemento hijo de un complexType o de un attributeGroup. Tienen un scope local. group Element: permite agrupar elementos de la misma forma que se hacia con parntesis en los DTDs.

choice, sequence & all Elements

Ya no necesitamos DTDs?

Schemas no proporcionan la funcionalidad ENTITY Incluidos en la especificacin XML (otras sintaxis requieren ir en fichero aparte)

Referencias

Recomendacin XML Schemas:

Introduccin a los conceptos: http://www.w3.org/TR/ xmlschema-0/ Estructuras: http://www.w3.org/TR/xmlschema-1/ Tipos de datos: http://www.w3.org/TR/xmlschema-2/.

Validador de XML Schemas: http://www.w3.org/2001/03/webdata/xsv

You might also like