4.7.1 Poniendo todo junto El DTD que cumple con esto, ubicado en el archivo persona.dtd, es:
4.8. Limitaciones de los DTD La No
Sintaxis no es XML (difíciles de manipular) soportan Espacios de nombres
No
permiten especificar tipos de datos (por ejemplo: enteros, flotantes, fechas, etc.
No
permiten especificar secuencias no ordenadas ((e1,e2,e3)|(e1,e3,e2)|(e2,e1,e3)|... (e3,e2,e1))
4.8. Limitaciones de los DTD No
hay soporte para declaraciones sensibles al contexto: Los elementos se definen todos a nivel de documento, ejemplo, contenido con el mismo nombre cuya estructura cambia en diferentes contextos
Soporte
limitado para Referencias cruzadas, no es posible formar claves a partir de varios atributos o de elementos
No
son extensibles (una vez definido, no es posible añadir nuevos vocabularios a un DTD)
5. Esquemas XML
5.1. Introducción OBJETIVOS
Aprender qué es un esquema Diferenciarlos de las DTD Construir esquemas Utilizar esquemas para validar XML VALIDACIÓN
DE DOCUMENTOS XML
DTD tienen ciertas limitaciones ESQUEMAS más eficientes 5
5.2. Definición de esquema Un
XSchema es un documento que describe el formato válido de un documento XML.
Es
similar a una DTD
define qué elementos puede contener un documento XML, cómo están organizados, y que atributos y de qué tipo pueden tener sus elementos.
5.3. Características de los esquemas Un
esquema XML define la estructura válida para un tipo de documento XML (al igual que las DTD), es decir: Los elementos que pueden aparecer en el documento Los atributos que pueden utilizarse junto a cada elemento Cómo se pueden anidar los elementos (padres e hijos) El orden en el que deben aparecer los elementos hijos de un mismo padre El número permitido de elementos hijos Si un elemento puede ser vacío o no Tipos de datos para elementos y atributos Valores por defecto y fijos para elementos y atributos
5.3. Características de los esquemas Los
esquemas se definen como documentos XML, en un documento aparte con extensión .XSD
En
los documentos XML que se basen en ese esquema, incluiremos una referencia al archivo .XSD
5.4. Comparación esquemas/DTD Usan
sintaxis de XML, al contrario que los DTDs.
Permiten Permiten
especificar los tipos de datos.
utilizar diferentes espacios de nombres (namespace), lo que implica que las reglas para validar ciertos elementos estarán definidas en cierto sitio (por ejemplo en www.w3c.org/2001/XMLSchema, mientras que otras reglas estarán en otro sitio.
5.4. Comparación esquemas/DTD Son
extensibles.
Por
ejemplo, un schema nos permite definir el tipo del contenido de un elemento o de un atributo, y especificar si debe ser un número entero, o una cadena de texto, o una fecha, etc. Los DTDs no nos permiten hacer estas cosas.
No
es posible describir ENTIDADES usando esquemas.
5.5. Partes de un esquema Declaración
del esquema
Elementos Tipos
de datos integrados simples
Tipos
definidos por el usuario
Tipos de datos simples Tipos de datos complejos
Lista
de atributos
5.1.1.Declaración del esquema <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> </xsd:schema>
El atributo xmlns indica la norma que sigue el esquema. Los elementos utilizados en la creación de un esquema “proceden” del espacio de nombres: http://www.w3.org/2001/XMLSchema Se podría no definir ninguno o usar uno de los más comunes xs o xsd. El elemento schema es el elemento raíz del documento en el que se define el esquema.
Declaración referencia de un esquema en un documento xml
Un
documento XML puede validarse contra varios esquemas Puede asociarse explícitamente mediante el atributo schemaLocation Si no se utiliza espacio de nombres, puede usarse el atributo noNamespaceSchemaLocation
Declaración referencia de un esquema en un documento xml Ejemplo:
alumnos.xml
<alumnos xmlns="http://www.univer.es/alumnos” xsi:SchemaLocation=“http://www.univer.es/alumnos alumnos.xsd” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance"> . . . </alumnos> Ejemplo:
brazil.xml
<?xml version="1.0"?> <pelicula xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="brazil-01.xsd"> <titulo>Brazil</titulo> </pelicula>
Declaración referencia de un esquema en un documento xml
En
el ejemplo de brazil.xml:
xsi:noNamespaceSchemaLocation= "brazil-01.xsd"> Esta línea indica que vamos a usar el fichero .xsd (contiene el Schema) para validar el documento xml, pero sin asociar un espacio de nombres a esas definiciones.
Declaración referencia de un esquema en un documento xml
Los
espacios de nombres deben coincidir. También puede usarse xsi:noNameSpaceLocation
Alumnos.xsd <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.univer.es/alumnos" xmlns="http://www.univer.es/alumnos"> <xsd:element name="alumnos"> ...
Declaración referencia de un esquema en un documento xml
Los
espacios de nombres deben coincidir. También puede usarse xsi:noNameSpaceLocation
Alumnos.xml <alumnos xmlns="http://www.univer.es/alumnos” xsi:schemaLocation=“http://www.univer.es/alumnos alumnos.xsd” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance"> . . . </alumnos>
Declaración referencia de un esquema en un documento xml Ejemplo de esquema BookStore.xsd <?xml version="1.0"?> <xsd:schema xmlns:xsd=http://www.w3.org/2001/xmlschema targetNamespace=http://www.books.org xmlns=http://www.books.org elementFormDefault="qualified"> <xsd:element name="BookStore"> <xsd:complexType> <xsd:sequence> <xsd:element ref="Book" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> ...
DeclaraciĂłnď&#x192; referencia de un esquema en un documento xml
Namespace del XMLSchema-instance
DeclaraciĂłnď&#x192; referencia de un esquema en un documento xml
El namespace de book (targetnamespace)
DeclaraciĂłnď&#x192; referencia de un esquema en un documento xml
DeclaraciĂłnď&#x192; referencia de un esquema en un documento xml
La instancia de documento xml puede ser: <?xml version="1.0"?> <BookStore xmlns ="http://www.books.org” xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.books.org BookStore.xsd"> <Book> <Title>My Life and Times</Title> <Author>Paul McCartney</Author> <Date>July, 1998</Date> <ISBN>94303-12021-43892</ISBN> <Publisher>McMillin Publishing</Publisher> </Book> ...
</BookStore>
Usar una declaración de namespace por defecto, diciéndole al validador del Esquema que todos los elementos usados en este documento vienen del namespace http://www.books.org
La instancia de documento xml puede ser: <?xml version="1.0"?> <BookStore xmlns ="http://www.books.org” xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.books.org BookStore.xsd"> <Book> <Title>My Life and Times</Title> <Author>Paul McCartney</Author> <Date>July, 1998</Date> <ISBN>94303-12021-43892</ISBN> <Publisher>McMillin Publishing</Publisher> </Book> ...
</BookStore>
Decirle al validador del esquema que el atributo schemaLocation que se está usando es el único en el namespace del XMLSchema-instance
La instancia de documento xml puede ser: <?xml version="1.0"?> <BookStore xmlns ="http://www.books.org” xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.books.org BookStore.xsd"> <Book> <Title>My Life and Times</Title> <Author>Paul McCartney</Author> <Date>July, 1998</Date> <ISBN>94303-12021-43892</ISBN> <Publisher>McMillin Publishing</Publisher> </Book> ...
</BookStore>
Con el schemaLocation se le dice al validador del esquema que el namespace http://www.books.org está definido por BookStore.xsd (por eso el schemaLocation tiene un par de valores)
DeclaraciĂłnď&#x192; referencia de un esquema en un documento xml
MĂşltiples niveles de chequeo
Elementos simples Permiten
estructurar la definición del documento.
elemento simple es un elemento que sólo puede contener texto (cualquier tipo de dato), pero no a otros elementos ni atributos
Un
Para
definir un elemento simple, utilizamos la sintáxis:
<xsd:element name="xxx" type="yyy"/> Ejemplos:
<xsd:element name="apellido" type="xsd:string"/> <xsd:element name="edad" type="xsd:integer"/> <xsd:element name="fecNac" type="xsd:date"/>
Tipos de datos simples: integrados o predefinidos
Tipos de datos simples: integrados o predefinidos
ď ľEJERCICIO.
Haz una tabla, con cada uno de los tipos de datos y su descripcion asociada.
Tipos de datos simples: integrados o predefinidos
Los más usuales son: Tipo
Descripción
Ejemplo
xsd:string
Cadena de texto
“brazil”
xsd:boolean
Valores booleanos
true, false
xsd:byte, xsd:short, xsd:integer, xsd:long
Números enteros
-7, 0, 10
xsd:float, xsd:double, xsd:decimal
Números decimales
-47, 12, 0, 134,23
xsd:date
Fecha
12/02/2011
xsd:time
Hora
21:00
Tipos de datos definidos por el usuario: simples
Tipos
de datos simples:
Todos los tipos de datos predefinidos son simples. En general representan valores atómicos (el número 7, el texto "Hola"), no listas. Excepcionalmente, se construyen no atómicos, como una lista de números primos (1,2 3,5,7,11...). Todos los tipos predefinidos son atómicos.
Tipos de datos definidos por el usuario: simples
Se
pueden asignar tanto a elementos que sólo tengan contenido textual como a atributos
También
se pueden construir, derivando de un tipo base predefinido al que se introducen restricciones.
Tipos de datos definidos por el usuario: simples
Ejemplo: Un
tipo de datos simple derivado es el que represente un correo electrónico. Se basa el tipo de datos predefinido xs:string, que representa cualquier cadena de texto, fuerza a que cumpla una serie de reglas (contener el carácter el carácter @, contener el carácter el carácter "."...).
Tipos de datos definidos por el usuario: simples
Definición
de tipos simples
Se usará el componente de definición de tipos simples, <xs:simpleType>. Se podrán limitar el rango de valores con el componente <xs:restriction>. Se
pueden asignar a elementos y a atributos.
Tipos de datos definidos por el usuario: simples xs:simpleType
Es el componente de definición de tipos simples. Atributos optativos principales: name:
nombre del tipo. Este atributo es obligatorio si el componente es hijo de <xs : schema>, de lo contrario no está permitido.
id:
identificador único para el componente.
Hasta ahora sólo se ha visto cómo asignar un tipo de datos predefinido (que siempre es simple) a un elemento.
Tipos de datos definidos por el usuario: simples
Ejemplo:
Asignar el tipo de datos predefinido xs:float al elemento <ingresosAnuales>. <xs:element name="ingresosAnuales" type="xs:float"/> La declaración anterior de elemento con un tipo simple asignado es una forma simplificada de a que se muestra a continuación. Se recomienda usar la simplificada.
Tipos de datos definidos por el usuario: simples
<xs:element name="ingresosAnuales"> <xs:simpleType> <xs:restriction base="xs:float" /> </xs:simpleType> </xs:element>
Tipos de datos definidos por el usuario: simples
Ahora se puede construir un tipo de datos simple, al que se le asignará un nombre, y que será un sinónimo del tipo de datos predefinido xs:float. Se usará el componente de restricción de valores de un tipo simple, xs:restriction. Este tipo no aporta nada nuevo a xs:float y se muestra a modo de ejemplo. No se recomienda definir tipos de datos que sean sinónimos a literales de predefinidos.
Tipos de datos definidos por el usuario: simples
<xs:simpleType name="TipoIngresosAnuales"> <xs:restriction base="xs:float" /> </xs:simpleType> <xs:element name= "ingresosAnuales" type="TipoIngresosAnuales"/>
Tipos de datos definidos por el usuario: simples
xs:restriction
Es un componente que define restricciones en los valores de un tipo. Atributos obligatorios: base:
nombre del tipo base a partir del cual se construirá el nuevo tipo, sea predefinido o construido.
Tipos de datos definidos por el usuario: simples
Atributos optativos principales: ď ąid:
identificador Ăşnico para el componente.
Tipos de datos definidos por el usuario: simples
Ejemplo:
Se declara un tipo simple que se utilizará para elementos que sean una contraseña. Será del tipo base xs:string, con unas facetas (se comentan a continuación) que fuercen su tamaño mínimo a 6 y máximo a 12.
Tipos de datos definidos por el usuario: simples
ď ľEjemplo:
<xs:simpleType name="TipoContrasenia"> <xs:restriction base="xs:string"> <xs:minLength value="6" /> <xs:maxLength value= "12" /> </xs:restriction> </xs:simpleType>
Tipos de datos definidos por el usuario: simples
La declaración de un elemento de nombre <clave> como del tipo recién creado sería: <xs:element name="clave" type="TipoContrasenia"> Un par de ejemplos de uso, uno válido y uno inválido, en un documento instancia XML son: <clave>claveValida!</clave> <clave>mala</clave>
Tipos de datos definidos por el usuario: simples
Facetas
length, minlength, maxlength: Longitud del tipo de datos pattern: Restricciones sobre valores mediante expresiones regulares enumeration: Restringe a una determinada enumeración de valores (max/min)(in/ex)clusive: Límites superiores/inferiores del tipo de datos totaldigits, fractionDigits: número de dígitos totales y decimales
Tipos de datos definidos por el usuario: simples
Ejemplo: El
elemento <edadLaboral> es un entero no negativo, que debe tener un valor mínimo a 16, incluido, y máximo 70, no incluido. En notación matemática se emplean los corchetes para identificar los intervalos cerrados (los extremos están incluidos) y paréntesis para identificar los intervalos abiertos (los extremos no están incluidos). En nuestro caso sería [16, 70)
Tipos de datos definidos por el usuario: simples
<xs:element name="edadLaboral"> <xs:simpleType> <xs:restriction base="xs:nonNegativelnteger"> <xs:minlnclusive value="16"/> <xs:maxExclusive value="70"/> </xs:restriction> </xs:simpleType> </xs:element>
Tipos de datos definidos por el usuario: simples
Si quisiĂŠramos definir un tipo de datos al que poder referenciar repetidas veces y declarar un elemento <edadLaboral> de ese tipo, serĂa:
Tipos de datos definidos por el usuario: simples
<xs:simpleType name="TipoEdadLaboral"> <xs:restriction base="xs:nonNegativelnteger"> <xs:minlnclusive value="16"/> <xs:maxExclusive value="70"/> </xs:restriction> </xs:simpleType> <xs: element name="edadLaboral" type="TipoEdadLaboral">
Tipos de datos definidos por el usuario: simples
Se recomienda llevar a cabo esta prĂĄctica, es decir, definir tipos de datos con nombre que puedan ser referenciados posteriormente. Se podrĂa crear una librerĂa de tipos de datos.
Tipos de datos definidos por el usuario: simples
Ejemplo: Se quiere definir un tipo de dato simple, TipoEstaciones, basado en el tipo predefinido xs:token, y que solamente permita como valores los nombres de las cuatro estaciones.
Tipos de datos definidos por el usuario: simples
<xs:simpleType name="TipoEstaciones"> <xs:restriction base="xs:token"> <xs:enumeration value="Primavera" /> <xs:enumeration value="Verano" /> <xs:enumeration value="Oto単o" /> <xs:enumeration value="Invierno"/> </xs:restriction> </xs:simpleType>
Tipos de datos definidos por el usuario: simples
Ejemplo: Se quiere un tipo de datos, TipoCantidad, basado en xs:decimal, que permita números con 2 dígitos decimales y 11 dígitos totales. El rango de valores implícito sería desde - 999.999.999,99 a 999.999.999,99.
Tipos de datos definidos por el usuario: simples
<xs:simpleType name="TipoCantidad"> <xs:restriction base="xs:decimal"> <xs:totalDigits value=â&#x20AC;&#x153;11"/> <xs:fractionDigits value="2"/> </xs:restriction> </xs:simpleType>
Tipos de datos definidos por el usuario: simples
Ejemplo: Se define un tipo basado en xs:string, usado para registrar direcciones en el que se quiere que todos los caracteres de espaciado (espacio, tabulador, nueva l铆nea y retorno de carro) se colapsen, lo que significa que si estos caracteres aparecen al principio o final de la cadena se eliminan, y si lo hacen en su interior, formando una hilera, se sustituyen en un solo espacio. La definici贸n de este tipo coincide con el tipo predefinido xs:token, derivado de xs:string.
Tipos de datos definidos por el usuario: simples
<xs:simpleType name="TipoDireccionFormateada" > <xs:restriction base="xs:string"> <xs:whiteSpace value="replace"/> </xs:restriction> </xs:simpleType>
Tipos de datos definidos por el usuario: simples EJERCICIO. Define diferentes tipos simples a partir de las siguientes especificaciones. A continuación, crea un esquema en el que sólo haya un elemento al que se le asigne un tipo simple de los definidos. Por último, escribe un documento instancia XML que sea válido con respecto a esE esquema. Repítelo para los distintos tipos definidos: a. Un número real con tres decimales que represente las temperaturas posibles en la Tierra, suponiendo que van desde -75° a 75°, ambas inclusive. b. Un xs:token que sólo pueda valer las siglas de los países vecinos de España, incluyendo a la propia España: ES, PR, FR, AN. c. Un número real que represente salarios, con 5 dígitos enteros y 2 decimales. d. Un mensaje de la red social Tweeter, conocido como tweet (trino), es una cadena de texto de una longitud máxima de 140 caracteres.
Tipos de datos definidos por el usuario: simples
xs:pattern Representa un patr贸n o expresi贸n regular que debe de cumplir la cadena de texto a la que se aplique. Ejemplo: Se quiere definir un tipo de datos, basado en xs:string, que se caracterice por cadenas de letras may煤sculas.
Tipos de datos definidos por el usuario: simples
<xs:simpleType name="TipoTresLetrasMayusculas"> <xs:restriction base="xs:string"> <xs:pattern value="[A-Z][A-Z][A-Z]"/> </xs:restriction> </xs:simpleType>
Tipos de datos definidos por el usuario: simples
Tipos de datos definidos por el usuario: simples
Tipos de datos definidos por el usuario: simples
Como se ha visto en los patrones anteriores, en las facetas se utilizan cuantifĂcadores (como tambiĂŠn se vio en los DTD):
Tipos de datos definidos por el usuario: simples
Hay ciertos caracteres que tienen un significado propio en las expresiones regulares: {, }, [, ],(,),?,*,+,-,|,^,.,\ Para indicar en una expresi贸n regular la aparici贸n literal de uno de estos caracteres, hay que anteponerle el car谩cter de escape \.
Tipos de datos definidos por el usuario: simples
Ejemplo: La expresión regular para una cadena que contenga las letras a o b o el carácter + sería: [ab\+]
Tipos de datos definidos por el usuario: simples
Ejemplo: Un número de teléfono que se quiere se represente como 3 dígitos, un punto, 3 dígitos, un punto, tres dígitos y un punto. Por ejemplo 912.345.678:
Tipos de datos definidos por el usuario: simples
Tipos de datos definidos por el usuario: simples
Ejemplo1: Dos dígitos seguidos de – seguidos de 3 dígitos seguidos de ? Seguidos de tres letras mayúsculas exceptuando la P. Ejemplo2: Define el siguiente patrón 22333 2333 22222333
Tipos de datos definidos por el usuario: simples
Ejercicio 1: Correo electr贸nico Ejercicio 2: Direcci贸n de red Ejercicio 3: Direcci贸n f铆sica
Tipos de datos definidos por el usuario: simples
Tipos de datos definidos por el usuario: simples
Más sobre derivación de tipos simples: uniones y listas Otra forma de derivar un tipo de datos consiste en definir uniones o listas de tipos de datos base: • Unión: es un tipo de datos creado a partir de una colección de tipos de datos base. Un valor es válido para una unión de tipos de datos si es válido para al menos uno de los tipos de datos que forman la unión. Se construye con el componente <xs: union>.
Tipos de datos definidos por el usuario: simples
Ejemplo: Se quiere reflejar que las tallas de ropa se pueden identificar por nĂşmeros (38, 40, 42) o por letras, que son las iniciales en inglĂŠs (S, M, L).
Tipos de datos definidos por el usuario: simples
Tipos de datos definidos por el usuario: simples
Cualquiera de estos dos fragmentos XML serĂan vĂĄlidos: <talla>42</talla> Y tambiĂŠn: <talla>M</talla>
Tipos de datos definidos por el usuario: simples
Lista: es un tipo de datos compuesto por listas de valores de un tipo de datos base. La lista de valores debe aparecer separada por espacios. Se construye con el componente <xs:list>.
Tipos de datos definidos por el usuario: simples
Ejemplo: Se define un tipo TipoListaNumerosBingo como una lista de valores enteros positivos que empieza en el 1 y acaba en el 90.
Tipos de datos definidos por el usuario: simples
Tipos de datos definidos por el usuario: simples
Un fragmento XML que sería válido para la definición precedente será: <numerosGanadores>1 7 19 34 42 60 63 73 </numerosGanadores>
Tipos de datos definidos por el usuario: simples