04.Estructura de Los Documentos W3C Esquemas

Post on 20-Jan-2016

81 views 3 download

Transcript of 04.Estructura de Los Documentos W3C Esquemas

Estructura de documentos Estructura de documentos XML. W3C EsquemasXML. W3C Esquemas

IES Mar de CádizIES Mar de CádizDpto. de InformáticaDpto. de Informática

Qué es XML Schema

►Es un conjunto de reglas que sirve para forzar la estructura y las restricciones de los contenidos de los documentos XML de una forma muy precisa.

►Es un documento XML con un vocabulario especializado

ESPACIOS DE NOMBRES EN ESQUEMASESPACIOS DE NOMBRES EN ESQUEMAS ► ESPACIOS DE NOMBRES:ESPACIOS DE NOMBRES: permiten escribir esquemas y validar permiten escribir esquemas y validar

documentos que usan elementos y atributos de múltiples documentos que usan elementos y atributos de múltiples vocabularios XML. Se utilizan los espacios de nombres para vocabularios XML. Se utilizan los espacios de nombres para evitar conflictos entre nombres de elementos o nombres de evitar conflictos entre nombres de elementos o nombres de atributos con igual nombre, pero significado distinto.atributos con igual nombre, pero significado distinto.

► Una diferencia importante entre las DTDs y Esquemas reside Una diferencia importante entre las DTDs y Esquemas reside en que éstas, como tales documentos XML, pueden usar en que éstas, como tales documentos XML, pueden usar vocabularios asociados a espacios de nombres.vocabularios asociados a espacios de nombres.

► Por lo que se abre la posibilidad de marcar la diferencia entre Por lo que se abre la posibilidad de marcar la diferencia entre elementos que compartan el mismo nombre pero no los elementos que compartan el mismo nombre pero no los mismos significados y viceversa. mismos significados y viceversa.

ESTRUCTURA DE UN ESQUEMAESTRUCTURA DE UN ESQUEMA titulo.xsd<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema“

elementFormDefault="qualified"> <xsd:element name=“TITULO” type=“xsd:String”/>

</xsd:schema>

<xsd:schema>–este elemento se utiliza como elemento raíz del documento y

actúa como contenedor del resto del contenidodel esquema

• Los prefijos: xsd: o xs:son usados por convención para denotar el espacio de nombre

del XML Schema, aunque cualquier otro prefijo podría ser usado

Inicio0.xsd

xmlns: es una palabra reservada en xsd, que indica al parser que este elemento es una declaración de un espacio de nombres.

xmlns:xsd

– todos los elementos en el esquema tienen el prefijo “xsd:”, el cual está asociado al espacio de nombre del XML Schema a través de la declaración “xmlns:xsd”.

•Atributo elementFormDefaut: •“qualified”: los elementos de un documento XML instancia de un esquema deberán ir todos precedidos de un prefijo del namespace (a menos que haya namespace por defecto)

•“unqualified”: sólo llevará prefijo el elemento raíz, y los elementos hijo lo herederán (salvo que se les indique expresamente otro prefijo)

•Atributo attributeFormDefault:•“unqualified”: en los atributos no hace falta indicar un prefijo (salvo que difiera del elemento en el que se encuadran), ya que su namespace será el mismo del elemento.•“qualified”: en los atributos se debe incluir siempre el prefijo del namespace.

Ir a diapositiva 25

ESPACIOS DE NOMBRES EN ESQUEMASESPACIOS DE NOMBRES EN ESQUEMAS

► Tengo una lista de clientes y otras de empleados y quiero guardar en Tengo una lista de clientes y otras de empleados y quiero guardar en un documento XML los clientes y el empleado que los atiende. un documento XML los clientes y el empleado que los atiende.

► ¿Cómo distinguir <nombre> del cliente de <nombre> del empleado?¿Cómo distinguir <nombre> del cliente de <nombre> del empleado?

<?xml version="1.0"?> <clientes> <nombre>Juan</nombre> <nombre>Luis</nombre> ... </clientes>

<?xml version="1.0"?> <empleados> <nombre>Juana</nombre> <nombre>Luisa</nombre> ...

</empleados>

<?xml version="1.0"?> <clientes> <nombre>Juan</nombre>

<nombre>Juana</nombre> <!-- cual? --> ...

</clientes>

¡ERROR!

SoluciónSolución► Solución: Asociar un alias a los elementos de un espacio de nombres Solución: Asociar un alias a los elementos de un espacio de nombres

dentro de un ámbito. dentro de un ámbito. ► xmlns:alias define alias en el ámbito de un elemento. xmlns:alias define alias en el ámbito de un elemento.

Definimos un namespace. Debe ser Definimos un namespace. Debe ser

única y se suele utilizar una URL única y se suele utilizar una URL

<?xml version="1.0"?> <clientes-empleados

xmlns:clientes="http://www.una-url.com/clientes/" xmlns:empleados="http://www.otra-url.com/empleados/"> <clientes:nombre>Juan</clientes:nombre> ... <empleados:nombre>Juana</empleados:nombre> ...

</clientes-empleados>

Son 2 etiquetas distintas

NOTA: Las URIs sólo se utilizan para que el nombre sea único, no son enlaces, ni

tienen que contener información

PAPEL DE LOS ESPACIOS DE NOMBRESPAPEL DE LOS ESPACIOS DE NOMBRES

► W3C XML Schema intenta superar las limitaciones W3C XML Schema intenta superar las limitaciones de las DTDs con respecto a ellos.de las DTDs con respecto a ellos.

► W3C XML Schema asocia un espacio de nombres a W3C XML Schema asocia un espacio de nombres a todos los objetos (elementos, atributos, tipos todos los objetos (elementos, atributos, tipos simples, complejos, ...) definidos en un schema.simples, complejos, ...) definidos en un schema.

► Definir un namespace por defecto para un Definir un namespace por defecto para un elemento nos evita tener que usar prefijos en todos elemento nos evita tener que usar prefijos en todos los elementos hijo. La sintaxis es: los elementos hijo. La sintaxis es: <xmlns="namespaceURI">.<xmlns="namespaceURI">.

PAPEL DE LOS ESPACIOS DE NOMBRESPAPEL DE LOS ESPACIOS DE NOMBRES

► Hay dos formas distintas de declarar espacios de nombres:

declaración explícita► se declara con un prefijo, y todos los nombres de elementos y

atributos que estén asociados con el espacio de nombre deberán utilizar el prefijo como parte de sus nombres cualificados resultan útiles cuando se quiere crear un documento que se apoya en múltiples espacios de nombre

declaración predeterminada (namespace por defecto)► se declara sin un prefijo, y se hace referencia a todos los nombres

de atributos y elementos que haya en su ámbito con nombres no cualificados, y se presupone que estos se encuentran en el espacio de nombre.

► Los prefijos no tienen que coincidir en el Schema y en los documentos instancia, sólo tienen que coincidir los espacios de nombres a los que se refieren. De hecho, uno podría usar prefijos y el otro podría usar el espacio de nombres por defecto.

DECLARACION DE UN ESQUEMA

A) Si se quiere que los elementos del documentos instancia referencien a un único esquema

<?xml version="1.0"?> <TITULO xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation=“titulo.xsd"> CURSO XML </TITULO>

• Hay dos maneras de declarar un esquema en un documento XML instancia de un esquema:

B) Si se quiere que los elementos del documento instancia puedan referenciar a uno o varios espacios de nombres

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

xmlns=“http://igae.pap.meh.es/xml/titulo "xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance“xsi:schemaLocation=“http://igae.pap.meh.es/xml/titulo

http://igae.pap.meh.es/xml/titulo.xsd”> CURSO XML </TITULO>

El elemento raíz sólo puede tener un atributo “xsi:schemaLocation”,y por tanto si hubiera varios espacios de nombres en el esquema, en ese atributo se recogerían todas las parejas URI_del espacio_de_nombre / URL(los dos componentes de la pareja se separan con un espacio en blanco, al igual que las parejas).

•En el caso B,

es necesario que el fichero .xsd del esquema defina un espacio de nombre destino mediante targetnamespace

<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema“

xmlns= “http://igae.pap.meh.es/xml/titulo “targetNamespace=

“http://igae.pap.meh.es/xml/titulo”elementFormDefault="qualified">

• El atributo targetNamespace (que es una URI) permite especificar el espacio de nombres para el cual un esquema define componentes.

• Hay que declarar en el esquema un espacio de nombres igual que el valor del atributo targetNamespace del XML, con o sin prefijo, según se quiera o no anteponer éste a los tag de xml.

Espacios de nombres:ámbito y validación

► Si definimos el espacio de nombres en el elemento raíz del documento, éste afecta a todos los elementos del documento.

► Si lo definimos en un elemento cualquiera, sólo afecta a él mismo y a todos sus elementos hijos.

► Se pueden cualificar atributos, pero no tiene casi utilidad.

COMPOSICION DE ESQUEMAS ► Si la mayoría de la información que se necesita en un esquema ya está

contenida en otro fichero XSD, no tiene sentido duplicarla en el resto de ficheros que la usen, ya que además se producirían problemas cuando haya que modificar una parte de un esquema que se repita en otros.

► Para importar un fichero de esquema XSD en otro fichero se utiliza el elemento <include>, si ambos ficheros tienen el mismo espacio de nombres de destino: <include schemaLocation=“ficheroejemplo.xsd“/>

► Para importar un fichero de esquema XSD, con un espacio de nombres de destino diferente, en otro fichero XSD, se usa el elemento <import>: <import namespace=“espacio_de_nombres"

schemaLocation=“URI_del_esquema_XSD"/>

El atributo namespace es opcional. ► Su espacio de nombres ha de ser el del targetNamespace del

esquema que importa.

Inclusión de Esquemas

Importación de Esquemas

Redefinición de Esquemas

En un proyecto en el que se crean varios esquemas,… ¿ debemos dar a cada esquema un targetNamespace diferente, o hay que dar a todos los esquemas de la misma targetNamespace, o deberíamos algunos de los esquemas no tienen targetNamespace?

Éstos son los cuatro enfoques de diseño para hacer frente a este problema: [1] Diseño Espacio de nombres Heterogénea:

dar a cada una de esquema targetNamespace diferente [2] Diseño Espacio de nombres Homogénea:

dar a todos los esquemas del mismo targetNamespace [3] Diseño Camaleón de Espacio de nombres:

dar al esquema "principal" un targetNamespace y no dar targetNamespace para los esquemas "de apoyo" (el espacio de nombres de esquemas de apoyo se llevará-en el targetNamespace del esquema principal, justo como un camaleón) [4] <redefine> -

sólo aplicable a los diseños Namespace homogéneos y Camaleón

[1] Diseño Espacio de nombres heterogéneos Este enfoque de diseño es para dar a cada esquema una targetNamespace diferente.En el ejemplo se presentan los tres esquemas diseñados utilizando este enfoque de diseño.Observa que cada esquema tiene un targetNamespace diferente.

Ejem: namespace_heterogéneos

[2] Diseño Espacio de nombres Homogénea Este enfoque de diseño dice para crear un único, targetNamespace paraguas para todos los esquemas. En el ejemplo se presentan los tres esquemas diseñados utilizando este enfoque. Observa que todos los esquemas tienen el mismo targetNamespace.Ejem: namespace_homogéneos

[3] Espacio de nombres Camaleón Diseño

Este enfoque de diseño dice para dar al esquema "principal" un targetNamespace, y los esquemas de "apoyo" no tienen targetNamespace.

En el ejemplo, el esquema de la empresa es el esquema principal.

Los esquemas persona y de productos están apoyando al esquema empresa.

Hay dos cosas a tener en cuenta acerca de este enfoque de diseño:

a) En primer lugar, como se muestra en el ejemplo, un esquema es capaz de acceder a los componentes en esquemas que no tienen targetNamespace, utilizando <include>.

b) En segundo lugar, observa las características de “como camaleón” van en los esquemas sin targetNamespace:

"Efecto camaleón" ... Este es un término acuñado por Henry Thompson para describir la capacidad de los componentes en un esquema sin targetNamespace tomar-en el espacio de nombres de otros esquemas.

Ejem: namespace_camaleon

[4]<redefine> - sólo aplicable a los diseños Namespace homogéneos y

Camaleón

El elemento <redefine> se utiliza para permitir el acceso a los componentes en otro esquema, mientras que al mismo tiempo da la capacidad de modificar cero o más de los componentes.

Por lo tanto, el elemento <redefine> tiene una doble funcionalidad: lo hace un <include> implícita. Por lo tanto, permite el acceso a todos los componentes en el esquema de referencia que le permite redefinir cero o más de los componentes en el esquema de referencia, es decir, ampliar o restringir los componentes

En el ejemplo, supongamos que desea utilizar TipoProducto en producto.xsd. Sin embargo, quisiera extender TipoProducto para incluir un identificador de producto. He aquí cómo hacerlo usando redefine.

Ejem: namespace_redefine

Claves y Unicidad

► Los DTDs proporcionaban el atributo ID para marcar la unicidad (un valor ID era único en todo el documento).

► XML Schema tiene más posibilidades: Indicar que un elemento es único (unique) Definir atributos únicos Definir combinaciones de elementos y atributos como únicos Distinción entre unicidad y claves (key)

► Clave = además de ser único, debe existir y no puede ser nulo.

► Declarar el rango de un documento en el que algo es único

Claves y Unicidad

Referencias a Claves

Limitaciones DTDLimitaciones DTD ► No utilizan un modelo de contenido abierto, no tolerando No utilizan un modelo de contenido abierto, no tolerando

elementos no definidos. elementos no definidos. ► Tipos de datos limitados - los DTDs proveen tipos de datos muy Tipos de datos limitados - los DTDs proveen tipos de datos muy

limitados:limitados:

► Los DTDs no usan sintaxis XML ► Es difícil definir rangos o conjuntos

<!ATTLIST fecha diaDeLaSemana (lunes | martes | miércoles | jueves | viernes | sábado | domingo) #IMPLIED>

Limitaciones DTDLimitaciones DTD► Sin Subclases Sin Subclases

DTD no permiten describir las estructuras de datos DTD no permiten describir las estructuras de datos comunes en una definición de clase y capturar todas las comunes en una definición de clase y capturar todas las variaciones en subclases. variaciones en subclases.

► El orden de los hijos es demasiado rígido - los DTD requieren: El orden de los hijos es demasiado rígido - los DTD requieren: Listar todos los elementos hijos en el orden en que deben Listar todos los elementos hijos en el orden en que deben

ocurrir ocurrir <!ELEMENT P (A, B+, C?)> <!ELEMENT P (A, B+, C?)>

► Sin soporte de espacio de nombres Sin soporte de espacio de nombres Para controlar la validez, debemos mantener los prefijos Para controlar la validez, debemos mantener los prefijos

del documento XML en sincronización con el DTD del documento XML en sincronización con el DTD

► Limitadas formas de expresar repeticiones Limitadas formas de expresar repeticiones El elemento B debe ocurrir exactamente 15 veces: El elemento B debe ocurrir exactamente 15 veces:

<!ELEMENT P (A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,C)><!ELEMENT P (A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,C)>

Ventajas sobre las DTDVentajas sobre las DTD

► Son documentos XML Son documentos XML se pueden procesar como cualquier otro documento XML se pueden procesar como cualquier otro documento XML

► Soportan tipos de datos Soportan tipos de datos se pueden definir elementos enteros, de coma flotante, fechas, se pueden definir elementos enteros, de coma flotante, fechas,

strings, etc. strings, etc.

► Son extensibles Son extensibles se pueden crear nuevos tipos de datos. se pueden crear nuevos tipos de datos.

► Mecanismos de Orientación a Objetos Mecanismos de Orientación a Objetos Permiten extender o restringir un tipo previamente definido Permiten extender o restringir un tipo previamente definido

► Tiene más poder de expresión Tiene más poder de expresión se puede especificar, por ejemplo, que cierto valor no tenga se puede especificar, por ejemplo, que cierto valor no tenga

más de 2 caracteres. más de 2 caracteres.

XML versus DTDXML versus DTD ► Documento XMLDocumento XML

► Document Type Definition (DTD) Document Type Definition (DTD)

<?xml version="1.0"?> <!DOCTYPE date SYSTEM "date.dtd"> <date> <day>14</day> <month>September</month> <year>2003</year> <weekday>Sunday</weekday> </date>

<!ELEMENT date (day, month, year, weekday?)> <!ELEMENT day (#PCDATA)>

<!ELEMENT month (#PCDATA)><!ELEMENT year (#PCDATA)>

<!ELEMENT weekday (#PCDATA)>

XML SchemasXML Schemas

► La propuesta inicial de Microsoft dio lugar a los llamados La propuesta inicial de Microsoft dio lugar a los llamados esquemas XDR”esquemas XDR”

► Posteriormente, el W3C diseñó un modelo de esquemas que Posteriormente, el W3C diseñó un modelo de esquemas que es la propuesta oficial y la que debemos conocer es la propuesta oficial y la que debemos conocer (llamados “esquemas XSD”)(llamados “esquemas XSD”)

► XSD se publicó como una recomendación el 31 de marzo del XSD se publicó como una recomendación el 31 de marzo del 2001 (se considera oficial desde mayo)2001 (se considera oficial desde mayo)

► XSD es más complejo que otras alternativas anteriores, pero XSD es más complejo que otras alternativas anteriores, pero supuso un importante paso hacia adelante en la supuso un importante paso hacia adelante en la estandarización de XMLestandarización de XML

XML SchemasXML Schemas ► Es un lenguaje de esquema utilizado para describir la Es un lenguaje de esquema utilizado para describir la

estructura y las restricciones de los contenidos de los estructura y las restricciones de los contenidos de los documentos XML de una forma muy precisa. documentos XML de una forma muy precisa.

► Desarrollado por W3C (World Wide Web Consorcium) Desarrollado por W3C (World Wide Web Consorcium)

► Son una sintáxis alternativa para las DTDs, propuesta Son una sintáxis alternativa para las DTDs, propuesta inicialmente por Microsoft, ArborText, Inso, etc.inicialmente por Microsoft, ArborText, Inso, etc.

► Utilizan la sintáxis propia de XMLUtilizan la sintáxis propia de XML

► Ventajas:Ventajas: Fáciles de aprender (se usa también XML)Fáciles de aprender (se usa también XML) Soportan tipos de datos: numéricos, fechas…Soportan tipos de datos: numéricos, fechas… Procesables igual que los documentos XMLProcesables igual que los documentos XML

Qué encontramos en un esquema XMLQué encontramos en un esquema XML

► Un esquema XML define la estructura válida para Un esquema XML define la estructura válida para un tipo de documento XML (al igual que las DTD), un tipo de documento XML (al igual que las DTD), es decir:es decir:

Los elementos que pueden aparecer en el documentoLos elementos que pueden aparecer en el documento Los atributos que pueden utilizarse junto a cada elementoLos atributos que pueden utilizarse junto a cada elemento Cómo se pueden anidar los elementos (padres e hijos)Cómo se pueden anidar los elementos (padres e hijos) El orden en el que deben aparecer los elementos hijos de El orden en el que deben aparecer los elementos hijos de

un mismo padreun mismo padre El número permitido de elementos hijosEl número permitido de elementos hijos Si un elemento puede ser vacío o noSi un elemento puede ser vacío o no Tipos de datos para elementos y atributosTipos de datos para elementos y atributos Valores por defecto y fijos para elementos y atributosValores por defecto y fijos para elementos y atributos

XML SchemasXML Schemas

XML Referenciando a SchemaXML Referenciando a Schema

EjemploEjemplo

EjemploEjemplo

XML Schema & XMLXML Schema & XML

inicio1.xsd

Schema XML: característicasSchema XML: características

► Son documentos XML. Son documentos XML.

► Soportan tipos de datos. Soportan tipos de datos.

► Soportan namespaces. Soportan namespaces.

► Permiten definir nuevos tipos de datos y Permiten definir nuevos tipos de datos y restricciones sobre los valores de un elemento. restricciones sobre los valores de un elemento.

► Ofrecen mayor precisión que los DTDs. Ofrecen mayor precisión que los DTDs.

Otras ventajas de XML SchemasOtras ventajas de XML Schemas

► Mayor precisión en la definición de tipos de datos Mayor precisión en la definición de tipos de datos mediante formatos y facetas o restricciones.mediante formatos y facetas o restricciones.

► Por ejemplo, la fecha:Por ejemplo, la fecha:<date type="date">1999-03-11</date> <date type="date">1999-03-11</date> ¿es el 11 de marzo o el 3 de noviembre?¿es el 11 de marzo o el 3 de noviembre?

► Los esquemas se definen como documentos XML, Los esquemas se definen como documentos XML, en un documento aparte con extensión .XSD en un documento aparte con extensión .XSD

► En los documentos XML que se basen en ese En los documentos XML que se basen en ese esquema, incluiremos una referencia al esquema, incluiremos una referencia al archivo .XSDarchivo .XSD

Estructura del Documento SchemaEstructura del Documento Schema

Esquemas XML : Esquemas XML : elemento schemaelemento schema

► Los elementos utilizados en la creación de un esquema “proceden” Los elementos utilizados en la creación de un esquema “proceden” del espacio de nombres: del espacio de nombres: http://www.w3.org/2001/XMLSchema

► Con el uso de Esquemas se produce un doble proceso de validación : Con el uso de Esquemas se produce un doble proceso de validación : un documento XML se valida respecto al Esquema yun documento XML se valida respecto al Esquema y éste a su vez es un documento que se valida de acuerdo con las éste a su vez es un documento que se valida de acuerdo con las

reglas del analizador de Esquemas. reglas del analizador de Esquemas.

► El elemento El elemento schemaschema es el elemento raíz del documento en el que se es el elemento raíz del documento en el que se define el esquema:define el esquema:

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

</xsd:schema></xsd:schema>

Comentarios en SchemaXML-Schema ofrece dos formas de insertar comentarios. Siempre dentro del elemento xs:annotation

► xs:documentation: es la forma de introducir documentación de código. ► xs:appinfo: está orientada a pasar información extra a las aplicaciones que

hagan uso del Schema.

Pueden incluirse en cualquier parte del XML_Schema.

► Mejoran la legibilidad (humana) del código.<xs:annotation>

<xs:documentation>texto

</xs:documentation></xs:annotation>

► También se pueden utilizar los comentarios de XML.<!-- Comentario -->

► Es preferible utilizar el tipo de comentarios propios de XML-Schema. Se pueden estructurar. Se pueden procesar como un documento XML.

► <xsd:annotation> Representa un elemento opcional de nivel raíz ("top level") empleado para colocar comentarios generales sobre un Schema, el término nivel raíz ("top level") se refiere a que éste debe ser colocado inmediatamente después del elemento <xsd:schema>.

► Anidado dentro de <xsd:annotation> deben estar los elementos <xsd:appInfo> y <xsd:documentation> que definen los comentarios en sí, el uso de estos elementos es descrito en la siguiente tabla :

TIPOS DE ELEMENTOSTIPOS DE ELEMENTOS DECLARACION DE UN ELEMENTO :<xsd:element name="nombreElemento“ type="tipoSimple/tipoCompuesto" minOccurs="valor“ maxOccurs="valor"/>

El valor por defecto de minOccurs y maxOccurs es “1”

Tipos: simples y tipos complejos

•tipos simples : •no contienen elementos ni atributos

•.sólo contienen datos•estos son algunos de los tipos simples más comunes

-xsd:string, xsd:integer, xsd:positiveInteger, xsd:int, xsd:long, xsd:short, xsd:decimal, xsd:float, xsd:double, xsd:boolean, xsd:time, xsd:date, ...

•tipos complejos :•pueden contener elementos, atributos y texto

–los elementos se declaran utilizando el elemento <xsd:element>–los atributos se declaran utilizando el elemento <xsd:attribute>

•se definen utilizando el elemento <xsd:complexType>•este elemento puede tener los siguientes subelementos (Indicadores de orden)

<xsd:sequence>, xsd:choice>, <xsd:all>

Tipos Complejos vs Simples Tipos Complejos vs Simples

► Pueden declararse 2 tipos: Pueden declararse 2 tipos: Complejos: Pueden contener sub-elementos y atributos. Complejos: Pueden contener sub-elementos y atributos. Simples: No contienen sub-elementos ni atributos Simples: No contienen sub-elementos ni atributos

► Pueden aparecer dentro de elementos o en valores de Pueden aparecer dentro de elementos o en valores de atributos atributos

<alumno dni="9873435"> <nombre>Jose</nombre> <apellidos>Bueno</apellidos>

</alumno>

simplescomplejos

Elementos complejosElementos complejos

► Son elementos que contienen a otros elementos Son elementos que contienen a otros elementos hijos, o que tienen atributoshijos, o que tienen atributos

► Se suelen dividir en 4 tipos:Se suelen dividir en 4 tipos: Elementos vacíosElementos vacíos Elementos no vacíos con atributosElementos no vacíos con atributos Elementos con elementos hijosElementos con elementos hijos Elementos con elementos hijos y con “texto” o valor propio Elementos con elementos hijos y con “texto” o valor propio

(como el contenido mixto de las DTD)(como el contenido mixto de las DTD)

Elementos complejosElementos complejos

► Ejemplos:Ejemplos:

<product pid="1345"/><product pid="1345"/>

<food type="dessert">Ice cream</food><food type="dessert">Ice cream</food>

<description><description>Sucedió el Sucedió el <date>03.03.99</date> <date>03.03.99</date> .... ....

</description> </description>

<employee> <employee> <firstname>John</firstname> <firstname>John</firstname> <lastname>Smith</lastname> <lastname>Smith</lastname>

</employee></employee>

Declarar elementos complejosDeclarar elementos complejos

► Para definir elementos complejos se utiliza la siguiente Para definir elementos complejos se utiliza la siguiente sintaxis:sintaxis:

<xsd:element name="empleado"> <xsd:element name="empleado"> <xsd:complexType> <xsd:complexType>

<xsd:sequence> <xsd:sequence> <xsd:element name=“nombre” <xsd:element name=“nombre”

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

type="xsd:string"/> type="xsd:string"/> </xsd:sequence> </xsd:sequence>

</xsd:complexType> </xsd:complexType> </xsd:element></xsd:element>

Ejem0.xsdEjemplo que vemos la equivqlencias con la DTD:

Declarar elementos complejosDeclarar elementos complejos

► Podemos usar otra sintaxis Podemos usar otra sintaxis para reutilizar la “definición” de los para reutilizar la “definición” de los elementoselementos hijos en varios elementos: hijos en varios elementos:

<xsd:element name="empleado" <xsd:element name="empleado" type="personinfo"type="personinfo"/> /> <xsd:element name=“estudiante” <xsd:element name=“estudiante” type="personinfo"type="personinfo"/> />

<xsd:complexType name="personinfo"> <xsd:complexType name="personinfo"> <xsd:sequence> <xsd:sequence>

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

<xsd:element name=“apellidos" <xsd:element name=“apellidos" type="xsd:string"/> type="xsd:string"/>

</xsd:sequence> </xsd:sequence> </xsd:complexType></xsd:complexType>

reutilizar.xsd

Declarar elementos complejosDeclarar elementos complejos

► Para declarar un Para declarar un elemento vacío con atributoselemento vacío con atributos, se utilizará la siguiente , se utilizará la siguiente sintáxis:sintáxis:

<xsd:element name="producto"> <xsd:element name="producto"> <xsd:complexType> <xsd:complexType> <xsd:attribute name=“fruta" <xsd:attribute name=“fruta"

type="xsd:positiveInteger"/>type="xsd:positiveInteger"/></xsd:complexType> </xsd:complexType>

</xsd:element> </xsd:element>

....................................................................................

<producto fruta="1345" /><producto fruta="1345" />

vacioconatr.xsd

Declarar elementos complejosDeclarar elementos complejos

► ¿Qué pasa si queremos que un elemento pueda tener atributos, pero no elementos hijo? Existe una ¿Qué pasa si queremos que un elemento pueda tener atributos, pero no elementos hijo? Existe una forma de hacer esto, utilizando los elementos “xsd:simpleContent” y “xsd:extension”. forma de hacer esto, utilizando los elementos “xsd:simpleContent” y “xsd:extension”.

► Para declarar un elemento Para declarar un elemento no vacío con atributosno vacío con atributos, y sin elementos hijos, se utilizará la siguiente sintáxis:, y sin elementos hijos, se utilizará la siguiente sintáxis:

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

Vacioconatr0.xsd Vacioconatr0.xsd

Declarar elementos complejosDeclarar elementos complejos

► el elemento puede contener tanto datos carácter como elementos hijo.el elemento puede contener tanto datos carácter como elementos hijo.

► Para declarar Para declarar un elemento con contenido “mixto”,un elemento con contenido “mixto”, basta con añadir un atributo “ basta con añadir un atributo “mixedmixed” al elemento xsd:complexType:” al elemento xsd:complexType:

<xsd:element name=“persona"> <xsd:element name=“persona"> <xsd:complexType <xsd:complexType mixed="true">>

<xsd:sequence> <xsd:sequence> <xsd:element name="nombre" type="xsd:string"/> <xsd:element name="nombre" type="xsd:string"/>

<xsd:element name=“hijos" type="xsd:positiveInteger"/> <xsd:element name=“hijos" type="xsd:positiveInteger"/> <xsd:element name=“fecha_nac" type="xsd:date"/> <xsd:element name=“fecha_nac" type="xsd:date"/> </xsd:sequence> </xsd:sequence>

</xsd:complexType> </xsd:complexType> </xsd:element></xsd:element>

Declarar elementos complejosDeclarar elementos complejos

► La declaración anterior permitiría un texto como el siguiente:La declaración anterior permitiría un texto como el siguiente:

<persona><persona>Nombre: Nombre: <nombre>Juan Perez</nombre><nombre>Juan Perez</nombre> Número de hijos: Número de hijos: <hijos>2</hijos> <hijos>2</hijos> Fecha nacimienrto: Fecha nacimienrto: < < fecha_nacfecha_nac >2001-07-13</ >2001-07-13</

fecha_nacfecha_nac> </persona></persona>

Elemmixto.xsd

Declarar elementos complejos: Declarar elementos complejos: IndicadoresIndicadores

► En los ejemplos anteriores hemos utilizado el elemento En los ejemplos anteriores hemos utilizado el elemento xsd:sequencexsd:sequence como elemento hijo del elemento como elemento hijo del elemento xsd:complexTypexsd:complexType

► xsd:sequencexsd:sequence indica que los elementos anidados en él deben aparecer indica que los elementos anidados en él deben aparecer en un orden determinadoen un orden determinado

► Los esquemas XML nos ofrecen otras alternativas, además de Los esquemas XML nos ofrecen otras alternativas, además de xsd:sequence, para indicar cómo se deben tratar los elementos que xsd:sequence, para indicar cómo se deben tratar los elementos que aparecen anidados en un elemento complejoaparecen anidados en un elemento complejo

Las opciones o “indicadores” son: Las opciones o “indicadores” son: xsd:all xsd:all y y xsd:choicexsd:choice

Declarar elementos complejos: Declarar elementos complejos: Indicador xsd:allIndicador xsd:all

► El indicadorEl indicador xsd:all xsd:all indica que los elementos que contiene pueden indica que los elementos que contiene pueden aparecer en cualquier orden, pero como máximo sólo una vez.aparecer en cualquier orden, pero como máximo sólo una vez.

<xsd:element name="persona"> <xsd:element name="persona"> <xsd:complexType> <xsd:complexType>

<<xsd:allxsd:all> > <xsd:element name="nombre" type="xsd:string"/> <xsd:element name="nombre" type="xsd:string"/>

<xsd:element name="apellido1" type="xsd:string"/> <xsd:element name="apellido1" type="xsd:string"/> <xsd:element name="apellido2" type="xsd:string"/> <xsd:element name="apellido2" type="xsd:string"/> </xsd:all> </xsd:all>

</xsd:complexType> </xsd:complexType> </xsd:element</xsd:element> >

Elemall.xsd

Declarar elementos complejos: Declarar elementos complejos: Indicador xsd:choiceIndicador xsd:choice

► El indicador El indicador xsd:choicexsd:choice Permite que uno y solo uno de los elementos Permite que uno y solo uno de los elementos contenidos en el grupo seleccionado esté presente en el elemento contenidos en el grupo seleccionado esté presente en el elemento contenedor.contenedor.

► El elemento El elemento xsd:choicexsd:choice puede incluir opcionalmente los atributos puede incluir opcionalmente los atributos minOccurs y maxOccurs, para especificar el mínimo y máximo número de minOccurs y maxOccurs, para especificar el mínimo y máximo número de

elementos hijos que pueden incluirse en el documento.elementos hijos que pueden incluirse en el documento.

<xsd:element name="persona"> <xsd:element name="persona"> <xsd:complexType> <xsd:complexType>

<<xsd:choicexsd:choice> > <xsd:element name=“nombre" <xsd:element name=“nombre"

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

type="xsd:string"/> type="xsd:string"/> </xsd:choice> </xsd:choice>

</xsd:complexType> </xsd:complexType> </xsd:element></xsd:element>

Elemchoice.xsd

Declarar elementos complejos: Declarar elementos complejos: Indicadores maxOccurs y minOccursIndicadores maxOccurs y minOccurs

► Estos indicadores se utilizan para indicar el número máximo y mínimo de Estos indicadores se utilizan para indicar el número máximo y mínimo de veces que puede aparecer un elemento hijo de un elemento complejoveces que puede aparecer un elemento hijo de un elemento complejo

► El atributo El atributo maxOccursmaxOccurs puede tomar el valor “ puede tomar el valor “unboundedunbounded”, que indica ”, que indica que no existe ningún límiteque no existe ningún límite

<xsd:element name="persona"> <xsd:element name="persona"> <xsd:complexType> <xsd:complexType> <xsd:sequence> <xsd:sequence>

<xsd:element name=“nombre_completo" type="xsd:string"/> <xsd:element name=“nombre_completo" type="xsd:string"/> <xsd:element name=“nombre_hijo" type="xsd:string" <xsd:element name=“nombre_hijo" type="xsd:string"

maxOccurs="10"maxOccurs="10"/> /> </xsd:sequence> </xsd:sequence> </xsd:complexType> </xsd:complexType> </xsd:element></xsd:element>

El modelo de contenido ANYEl modelo de contenido ANY

► En esquemas XML también contamos con un modelo de contenido En esquemas XML también contamos con un modelo de contenido ANYANY, , que permite incluir elementos no declarados inicialmente en el esquema.que permite incluir elementos no declarados inicialmente en el esquema.

► A través de A través de <xsd:any><xsd:any> se puede indicar la presencia de cualquier tipo se puede indicar la presencia de cualquier tipo de elemento; el fragmento indica que dentro del elemento persona una de elemento; el fragmento indica que dentro del elemento persona una vez que se encuentre el elemento vez que se encuentre el elemento apellidoapellido puede existir cualquier puede existir cualquier elemento adicional.elemento adicional.

<xsd:element name="persona"> <xsd:element name="persona"> <xsd:complexType> <xsd:complexType>

<xsd:sequence> <xsd:sequence> <xsd:element name="nombre" <xsd:element name="nombre"

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

type="xsd:string"/> type="xsd:string"/> <xsd:any minOccurs="0"/> <xsd:any minOccurs="0"/>

</xsd:sequence> </xsd:sequence> </xsd:complexType> </xsd:complexType>

</xsd:element></xsd:element>

Elemany.xsd

El modelo de contenido ANY - atributosEl modelo de contenido ANY - atributos

► También contamos con un elemento que permite extender el número de También contamos con un elemento que permite extender el número de atributos de un elemento:atributos de un elemento:

<xsd:element name="person"> <xsd:element name="person"> <xsd:complexType> <xsd:complexType>

<xsd:sequence> <xsd:sequence> <xsd:element name="firstname" <xsd:element name="firstname"

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

type="xsd:string"/> type="xsd:string"/> </xsd:sequence> </xsd:sequence> <xsd:anyAttribute/><xsd:anyAttribute/>

</xsd:complexType> </xsd:complexType> </xsd:element></xsd:element>

Tipos derivados por extensiónTipos derivados por extensión

► En la declaración de elementos complejos, es En la declaración de elementos complejos, es posible utilizar un posible utilizar un mecanismo de “herencia”mecanismo de “herencia” para reutilizar o extender elementos para reutilizar o extender elementos definidos con anterioridad (ver la siguiente definidos con anterioridad (ver la siguiente página)página)

Ejem4.xsd

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

<xsd:complexType name="personinfo"> <xsd:complexType name="personinfo"> <xsd:sequence> <xsd:sequence>

<xsd:element name="firstname" type="xsd:string"/> <xsd:element name="firstname" type="xsd:string"/> <xsd:element name="lastname" type="xsd:string"/> <xsd:element name="lastname" type="xsd:string"/>

</xsd:sequence> </xsd:sequence> </xsd:complexType></xsd:complexType>

<xsd:complexType name="fullpersoninfo"> <xsd:complexType name="fullpersoninfo"> <xsd:complexContent> <xsd:complexContent>

<xsd:extension base="personinfo"> <xsd:extension base="personinfo"> <xsd:sequence> <xsd:sequence>

<xsd:element name="address" type="xsd:string"/> <xsd:element name="address" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="country" type="xsd:string"/> <xsd:element name="country" type="xsd:string"/>

</xsd:sequence> </xsd:sequence> </xsd:extension> </xsd:extension>

</xsd:complexContent> </xsd:complexContent> </xsd:complexType></xsd:complexType>

ELEMENTOS GLOBALES ► Para facilitar la legibilidad de los XML Schemas y reutilizar definiciones de otros

esquemas, nos puede ser útil crear un elemento global, y hacer referencias al mismo.

► Los elementos globales son elementos que son hijos inmediatos del elemento “schema”.

► Los elementos locales son elementos anidados dentro de otros elementos.

► Un elemento global : tiene que estar declarado como un subelemento del elemento <xsd:schema>, pero

nunca como parte de un elemento de tipo complejo no puede contener referencias

► es decir no pueden albergar el atributo ref no puede indicar el número de ocurrencias que tiene que aparecer un elemento.

► Esta es la sintaxis de una declaración local que hace referencia a un elemento global<xsd:element ref="nombreElementoGlobalYaExistente" minOccurs="valor">

► el atributo ref hace referencia a un elemento global (que puede estar definido en otro fichero xsd, al que se referencia mediante un espacio de nombres)

► en la declaración local, si queremos podemos indicar la cardinalidad del elemento global con los atributos (Indicadores de cantidad) minOccurs y maxOccurs

EJEMPLO CON REFERENCIAS A ELEMENTOS GLOBALES:

Ejem3.xsd

<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema“

targetNamespace=“http://igae.meh.es/cancion”elementFormDefault="qualified">

<xsd:element name=“CANCION” type=“Tipocancion”/><xsd:complexType name=“Tipocancion”>

<xsd:sequence><xsd:element name=“NOMBRE” type=“xsd:string”><xsd:element name=“AUTOR” type=“xsd:string”>

</xsd:sequence></xsd:complexType></xsd:schema>

ELEMENTOS GLOBALES EJEMPLO SIN REFERENCIAS A ELEMENTOS GLOBALES:

• Ahora vamos a definir otro esquema que agregará a sus elementos y atributos locales otros procedentes del esquema : “http://igae.meh.es/cancion”.

• Esto se hace mediante un elemento xsd:import

<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema“ xmlns:cc=“http://igae.meh.es/cancion”

elementFormDefault="qualified">

<xsd:import namespace=“http://igae.meh.es/cancion” schemaLocation="http://igae.meh.es/cancion.xsd" />

<xsd:element name=“DISCO"> <xsd:complexType>

<xsd:sequence><xsd:element ref=“cc:CANCION”

maxoccurs=“unbounded”/><element name=“EDITORIAL” type=“xsd:string”/>

</xsd:sequence> </xsd:complexType></xsd:element></xsd:schema>

EJEMPLO CON REFERENCIAS A ELEMENTOS GLOBALES:

Elem_globales.xsd

Esquemas XML : elementos Esquemas XML : elementos “simples”“simples”

► Un elemento simple es un elemento que sólo puede contener texto Un elemento simple es un elemento que sólo puede contener texto (cualquier tipo de dato), pero no a otros elementos ni atributos.(cualquier tipo de dato), pero no a otros elementos ni atributos.

► Para definir un elemento simple, utilizamos la sintáxis:Para definir un elemento simple, utilizamos la sintáxis:<xsd:element name="xxx" type="yyy"/><xsd:element name="xxx" type="yyy"/>

► Ejemplos:Ejemplos:<xsd:element name=“apellido” type="xs:string"/><xsd:element name=“apellido” type="xs:string"/><xsd:element name=“edad" type="xs:integer"/> <xsd:element name=“edad" type="xs:integer"/> <xsd:element name=“fecNac" type="xs:date"/> <xsd:element name=“fecNac" type="xs:date"/>

► Los tipos de datos más utilizados son:Los tipos de datos más utilizados son: xsd:string, xsd:decimal , xsd:integer , xsd:boolean , xsd:date , xsd:timexsd:string, xsd:decimal , xsd:integer , xsd:boolean , xsd:date , xsd:time

► Un elemento simple puede tener un valor por “defecto” y un valor “fijo”Un elemento simple puede tener un valor por “defecto” y un valor “fijo”

► Esto se indica mediante los atributos Esto se indica mediante los atributos defaultdefault y y fixedfixed <xsd:element name="color" type="xsd:string" default="red"/><xsd:element name="color" type="xsd:string" default="red"/>

Tipos de datos simples

Tipos de datos simples

Tipos de datos simples

Expresiones Regulares

Ejem2.xsd

Derivación de Tipos Simples

Existen tres mecanismos de derivación:

► Por enumeración (lista): el rango se describe explícitamente como la lista de valores válidos.

► Por unión : mediante unión de dos o más tipos de datos.

► Por restricción: se restringe el rango de valores del tipo de datos.

El mecanismo de extensión sólo se aplica a los tipos de datos complejos.

Tipo Simple derivado “Lista”

► Las listas son siempre tipos derivados que permiten varios valores en el contenido de un elemento.

► Las listas son similares a la faceta “enumeration”, pero permiten incluir valores múltiples, separados mediante espacios. Las listas permiten elegir el tipo de datos de los valores en la lista, mediante el atributo "itemType”, incluyendo tipos definidos por el usuario.

► También se pueden aplicar otras facetas, como “length”, etc.

► Mediante <xsd:list> es posible definir que un tipo de dato simpleType que cumpla con la características de una lista; el fragmento siguiente demuestra la definición de dos tipos de datos (simpleType) uno para una lista de números decimales y otro para una lista de String's, ambas declaraciones les sigue la posible

definición del elemento en XML .

► Los valores de la lista se separan mediante “blancos”.

<xs:simpleType name=“listaFechas”>

<xs:list itemType =“xs:date”/></xs:simpleType>

<xs:element name=“listaCumpleaños” type=“listaFechas”>

------------------------------------------<listaCumpleaños>

1975-03-25 1999-05-03 2001-09-27</listaCumpleaños>

<xsd:simpleType name="precios">

<xsd:list itemType="xsd:decimal"/>

</xsd:simpleType>

<xsd:element name="historiaprecios" type="precios">

________________________

<historiaprecios> 5.32 6.23 6.86 7.01 </historiaprecios>

<xsd:simpleType name="valuelist">

<xsd:list itemType="xsd:string"/> </xsd:simpleType>

<xsd:element name="nombres" type="valuelist">

__________________

<stringvalues> Andrea Bertha Carla Daniela Esther

</stringvalues>

Ejemlist.xsd

Tipo Simple derivado “Unión”

► Mediante <xsd:union> es posible definir un nuevo tipo de datos (simpleType) a partir de la unión de otros dos tipo de datos (simpleType).

► Se componen de al menos dos tipos de datos alternativos.

► El orden en que se definen los TD en la unión es significativo: los datos se intentan validar en ese orden.

<simpleType name=“NumRomano”><restriction base=“xs:string”>

<enumeration value=“I”/><enumeration value=“II”/><enumeration value=“III”/>

</restriction></simpleType>

Ejemplo de Unión

<simpleType name=“CapituloRom”><list itemType=“NumRomano”/>

</simpletType>

<simpleType name=“CapituloDec”><list itemType=“xs:integer”/>

</simpletType>

<simpleType name=“union.Capitulos”><union memberTypes=“CapituloRom

CapituloDec”/></simpletType>

……………………………………….<numerosCap>1 2 3 4 5</numerosCap><numerosCap>I II III</numerosCap>

elemenunion0.xsd

elemenunion.xsd

ELEMENTOS Y ATRIBUTOS EN ESQUEMASELEMENTOS Y ATRIBUTOS EN ESQUEMAS ► A. EL ELEMENTO A. EL ELEMENTO ELEMENT ELEMENT

► Como se ha adelantado, los elementos que van a aparecer en un documento Como se ha adelantado, los elementos que van a aparecer en un documento instancia deben aparecer en el Esquema con un elemento element, cuyos instancia deben aparecer en el Esquema con un elemento element, cuyos atributos más significativos son : atributos más significativos son : maxOccurs maxOccurs y y minOccursminOccurs : determinan el número máximo ( mínimo ) de : determinan el número máximo ( mínimo ) de

veces que el elemento puede aparecer en un documento instancia; veces que el elemento puede aparecer en un documento instancia; obviamente, sólo se aplican a atributos de elementos de tipo real. obviamente, sólo se aplican a atributos de elementos de tipo real.

namename : especifica el nombre usado para referenciar un tipo de elemento : especifica el nombre usado para referenciar un tipo de elemento tanto en el resto del Esquema como en un documento instancia. tanto en el resto del Esquema como en un documento instancia.

refref : hace referencia a un elemento global ya declarado. Es mutuamente : hace referencia a un elemento global ya declarado. Es mutuamente excluyente con name. excluyente con name.

typetype : especifica el tipo de dato del elemento, con un valor nombre referido : especifica el tipo de dato del elemento, con un valor nombre referido a un tipo global, simple o complejo. a un tipo global, simple o complejo.

► Ejemplo : Ejemplo : <xsd:element name=”algunElemento” type=”xs:string”/> <xsd:element name=”algunElemento” type=”xs:string”/>

► La mayoría de elementos que se usan tienen elementos locales ( tanto La mayoría de elementos que se usan tienen elementos locales ( tanto simpleType como complexType ) o una referencia a un tipo global ( simple o simpleType como complexType ) o una referencia a un tipo global ( simple o complejo ) a través del atributo type.complejo ) a través del atributo type.

siendo las opciones de contenido para el elemento siendo las opciones de contenido para el elemento elementelement : : annotation, simpleType y complexTypeannotation, simpleType y complexType. .

► B. EL ELEMENTO B. EL ELEMENTO ATTRIBUTE ATTRIBUTE

► En un Esquema XML los atributos se declaran por medio del elemento En un Esquema XML los atributos se declaran por medio del elemento attributeattribute que a su vez tiene una serie de atributos que ponen restricciones a que a su vez tiene una serie de atributos que ponen restricciones a las propiedades de esta declaración, cuya panorámica depende de su las propiedades de esta declaración, cuya panorámica depende de su ubicación dentro del Esquema ( como se sabe un atributo global ubicación dentro del Esquema ( como se sabe un atributo global debe declararse como hijo del elemento schema ). debe declararse como hijo del elemento schema ).

► Dado el fragmento : Dado el fragmento : <xsd:schema> <xsd:schema>

<xsd:attribute name=”miAtributo”/> <xsd:attribute name=”miAtributo”/> <xsd:element name=”algunElemento” type=”xs:string”/> <xsd:element name=”algunElemento” type=”xs:string”/>

</xsd:schema> </xsd:schema>

► el atributo miAtributo es global, y puede referenciarse en cualquier elemento el atributo miAtributo es global, y puede referenciarse en cualquier elemento o grupo de atributos del documento.o grupo de atributos del documento.

► En el caso que se quiera declarar un atributo de forma local, éste se coloca En el caso que se quiera declarar un atributo de forma local, éste se coloca como hijo de la declaración del elemento correspondiente. como hijo de la declaración del elemento correspondiente.

ELEMENTOS Y ATRIBUTOS EN ESQUEMAS

EjemploEjemplo

► Los atributos de un elemento son muy parecidos a los vistos para Los atributos de un elemento son muy parecidos a los vistos para elementelement. La diferencia más importante es que los atributos son . La diferencia más importante es que los atributos son siempre de tipo simple. siempre de tipo simple.

► Un atributo específico del elemento Un atributo específico del elemento attributeattribute es es useuse, que da la , que da la posibilidad de limitar el uso del atributo en un documento instancia, posibilidad de limitar el uso del atributo en un documento instancia, pudiendo tomar los valores : pudiendo tomar los valores : optional, prohibited, y required.optional, prohibited, y required.

► Señalar que en los atributos como norma se aplica el valor por Señalar que en los atributos como norma se aplica el valor por defecto cuando los atributos no quedan determinados. defecto cuando los atributos no quedan determinados.

<xsd:schema> <xsd:schema> <xsd:element name=”algunElemento”> <xsd:element name=”algunElemento”>

<xsd:complexType> <xsd:complexType> <xsd:attribute name=”miAtributo”/> <xsd:attribute name=”miAtributo”/>

</xsd:complexType> </xsd:complexType> </xsd:element> </xsd:element>

</xsd:schema> </xsd:schema>

Esquemas XML :atributos (1)Esquemas XML :atributos (1)

► Los atributos se deben declarar de forma similar a los Los atributos se deben declarar de forma similar a los “elementos simples”.“elementos simples”.

► Si un elemento puede ir acompañado de atributos, el Si un elemento puede ir acompañado de atributos, el elemento se deberá declarar como un elemento elemento se deberá declarar como un elemento “complejo”.“complejo”.

► Un atributo se declara de la siguiente forma:Un atributo se declara de la siguiente forma:<xsd:attribute name="xxx" type="yyy"/><xsd:attribute name="xxx" type="yyy"/>

EjemploEjemplo::<xsd:attribute name=“idioma" type="xs:string"/><xsd:attribute name=“idioma" type="xs:string"/>

► Los atributos tienen un tipo de dato: Los atributos tienen un tipo de dato: xsd:string, xsd:decimal, xsd:integer, xsd:boolean, xsd:date, xsd:string, xsd:decimal, xsd:integer, xsd:boolean, xsd:date,

xsd:timexsd:time

Esquemas XML – atributos (2)Esquemas XML – atributos (2)

► Los atributos pueden tener valores por defecto y valores fijos:Los atributos pueden tener valores por defecto y valores fijos:<xsd:attribute name=“idioma" type="xsd:string" <xsd:attribute name=“idioma" type="xsd:string"

default=“ES"/>default=“ES"/>

► Por defecto, los atributos son opcionales. Por defecto, los atributos son opcionales.

► Para indicar que un atributo debe ser obligatorio, se debe Para indicar que un atributo debe ser obligatorio, se debe añadir a su declaración en el esquema es atributo añadir a su declaración en el esquema es atributo ““useuse””

<xsd:attribute name="lang" type="xsd:string" <xsd:attribute name="lang" type="xsd:string" use="required"/>use="required"/>

► El atributo El atributo useuse puede tomar el valor “puede tomar el valor “optionaloptional” si el atributo ” si el atributo no es obligatorio (opción por defecto)no es obligatorio (opción por defecto)

Ejem1.xsd

Esquemas XML : facetas o Esquemas XML : facetas o restriccionesrestricciones

► Las facetas o restricciones permiten restringir el valor que se Las facetas o restricciones permiten restringir el valor que se puede dar a un elemento o atributo XML.puede dar a un elemento o atributo XML.

► Mediante restricciones podemos indicar que un valor debe estar Mediante restricciones podemos indicar que un valor debe estar comprendido en un rango determinado, debe ser un valor de comprendido en un rango determinado, debe ser un valor de una lista de valores “cerrada”, o debe ser mayor o menor que una lista de valores “cerrada”, o debe ser mayor o menor que otro valor…otro valor…

► Tipos de facetas:Tipos de facetas: Valor comprendido en un rangoValor comprendido en un rango El valor está restringido a un conjunto de valores posiblesEl valor está restringido a un conjunto de valores posibles Restringir el valor de un elemento a una serie de caracteresRestringir el valor de un elemento a una serie de caracteres

► Longitud de los valores de los elementos…Longitud de los valores de los elementos…http://xml.osmosislatina.com/curso/validar/elementos_schema.htm

https://sites.google.com/site/todoxmldtd/home

Derivación por restricción:mediante patrones

► . = cualquier carácter.► \d = un dígito► \D = un no-dígito► \s = cualquier carácter blanco (nueva-línea, tab, retorno de

carro).► \S = cualquier carácter no-blanco.► * = cardinalidad 0..N► ? = opcionalidad► + = cardinalidad 1..N► [abc] = sólo uno del grupo► [0-9] = rango de valores► (xy) = “y” conjunción► | = operador “or” lógico► X{5} = 5 ocurrencias de x► x{5,} = al menos 5 ocurrencias de x► X{5,8} = mínimo 5 y máximo 8 ocurrencias de x► (xyz){2} = dos ocurrencias de xyz

Derivación mediante patrones: Ejemplo

<xs:simpleType name=“TipoCódigoPostal”><xs:restriction base=“xs:string”>

<xs:pattern value=“\d{5}(-\d{4})?”/></xs:restriction>

</xs:simpleType>

<xs:element name=“códigoPostal”type=“TipoCódigoPostal”>

------------------------------------------<códigoPostal>12345-9876</códigoPostal><códigoPostal>31415</códigoPostal>

Ejemplo de Unión y restricciones

Tipos Simples Anónimos

► Pueden definirse tipos internamente sin nombre. No se pueden usar en la definición de otro elemento.

<xs:element name=“códigoPostal”><xs:simpleType><xs:restriction base=“xs:string”>

<xs:pattern value=“\d{5}(-\d{4})?”/></xs:restriction></xs:simpleType>

</xs:element>

Restricción por rangos

► xs:minExclusive► xs:maxInclusive► xs:maxExclusive

<xs:simpleType name=“fechaCreación”><xs:restriction base=“xs:date”>

<xs:nimInclusive value=“2001:09:27”/></xs:restriction>

</xs:simpleType>

Otros tipos de restricciones

► Limitar la longitud de una cadena:

<xs:length value=“x”> <xs:maxLength value=“m”><xs:minLength value=“n”>

► Limitar el número de dígitos de una cifra:

<xs:precision value=“n”> : máximo número de dígitos totales.

<xs:scale value=”m”> : máximo numero de dígitos a la derecha del

punto decimal.

Restricción por enumeración

<xs:simpleType name=“Paises”><xs:restriction base=“xs:string”>

<xs:enumeration value=“España”/><xs:enumeration

value=“Francia”/><xs:enumeration

value=“Portugal”/><xs:enumeration value=“Italia”/>

</xs:restriction></xs:simpleType>

<pais>España</pais>

En la instancia, los valores deben estar separados por “blanco”.

Esquemas XML – restricciones (ej. 1)Esquemas XML – restricciones (ej. 1)

<xsd:element name="age"><xsd:element name="age">

<xsd:simpleType> <xsd:simpleType>

<xsd:restriction base="xsd:integer"> <xsd:restriction base="xsd:integer">

<xsd:minInclusive value="0"/> <xsd:minInclusive value="0"/>

<xsd:maxInclusive <xsd:maxInclusive value="100"/> value="100"/>

</xsd:restriction> </xsd:restriction>

</xsd:simpleType></xsd:simpleType>

</xsd:element></xsd:element>

Esquemas XML – restricciones (ej. 2)Esquemas XML – restricciones (ej. 2)

<xsd:element name="car"><xsd:element name="car">

<xsd:simpleType> <xsd:simpleType>

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

<xsd:enumeration value="Audi"/> <xsd:enumeration value="Audi"/>

<xsd:enumeration value="Golf"/> <xsd:enumeration value="Golf"/>

<xsd:enumeration value="BMW"/> <xsd:enumeration value="BMW"/>

</xsd:restriction> </xsd:restriction>

</xsd:simpleType></xsd:simpleType>

</xsd:element></xsd:element>

Esquemas XML – restricciones (ej. 2, Esquemas XML – restricciones (ej. 2, alt.)alt.)

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

<xsd:simpleType name="carType"> <xsd:simpleType name="carType">

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

<xsd:enumeration value="Audi"/> <xsd:enumeration value="Audi"/>

<xsd:enumeration value="Golf"/> <xsd:enumeration value="Golf"/>

<xsd:enumeration value="BMW"/> <xsd:enumeration value="BMW"/>

</xsd:restriction> </xsd:restriction>

</xsd:simpleType></xsd:simpleType>

Esquemas XML – restricciones (ej. 3)Esquemas XML – restricciones (ej. 3)

<xsd:element name="letter"><xsd:element name="letter">

<xsd:simpleType> <xsd:simpleType>

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

<xsd:pattern value="[a-z]"/> <xsd:pattern value="[a-z]"/>

</xsd:restriction> </xsd:restriction>

</xsd:simpleType></xsd:simpleType>

</xsd:element></xsd:element>

En este ejemplo, el elemento “letter” debe En este ejemplo, el elemento “letter” debe tomar como valor 1 letra minúscula (sólo 1)tomar como valor 1 letra minúscula (sólo 1)

Esquemas XML – restricciones (ej. 4)Esquemas XML – restricciones (ej. 4)

<xsd:element name="iniciales"><xsd:element name="iniciales">

<xsd:simpleType> <xsd:simpleType>

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

<xsd:pattern value="[a-zA-Z][a-zA-Z][a-zA-<xsd:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/> Z]"/>

</xsd:restriction> </xsd:restriction>

</xsd:simpleType></xsd:simpleType>

</xsd:element> </xsd:element>

En este ejemplo, el elemento “iniciales” debe tomar como En este ejemplo, el elemento “iniciales” debe tomar como valor tres letras mayúsculas o minúscula (sólo 3)valor tres letras mayúsculas o minúscula (sólo 3)

Esquemas XML – restricciones (ej. 5)Esquemas XML – restricciones (ej. 5)

<xsd:element name=“opcion"><xsd:element name=“opcion">

<xsd:simpleType> <xsd:simpleType>

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

<xsd:pattern value="[xyz]"/> <xsd:pattern value="[xyz]"/>

</xsd:restriction> </xsd:restriction>

</xsd:simpleType></xsd:simpleType>

</xsd:element> </xsd:element>

En este ejemplo, el elemento “opcion” debe tomar En este ejemplo, el elemento “opcion” debe tomar como valor una de estas letras: x, y o zcomo valor una de estas letras: x, y o z

Esquemas XML – restricciones (ej. 6)Esquemas XML – restricciones (ej. 6)

<xsd:element name=“digitos"><xsd:element name=“digitos">

<xsd:simpleType> <xsd:simpleType>

<xsd:restriction base="xsd:integer"> <xsd:restriction base="xsd:integer">

<xsd:pattern value="[0-9][0-9][0-9][0-9][0-<xsd:pattern value="[0-9][0-9][0-9][0-9][0-9]"/> 9]"/>

</xsd:restriction> </xsd:restriction>

</xsd:simpleType></xsd:simpleType>

</xsd:element></xsd:element>

Esquemas XML – restricciones (ej. 7)Esquemas XML – restricciones (ej. 7)

<xsd:element name="letras"><xsd:element name="letras">

<xsd:simpleType> <xsd:simpleType>

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

<xsd:pattern value="([a-z])*"/> <xsd:pattern value="([a-z])*"/>

</xsd:restriction> </xsd:restriction>

</xsd:simpleType></xsd:simpleType>

</xsd:element></xsd:element>

Esquemas XML – restricciones (ej. 8)Esquemas XML – restricciones (ej. 8)

<xsd:element name="password"><xsd:element name="password">

<xsd:simpleType> <xsd:simpleType>

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

<xsd:pattern value="[a-zA-Z0-9]{8}"/> <xsd:pattern value="[a-zA-Z0-9]{8}"/>

</xsd:restriction> </xsd:restriction>

</xsd:simpleType></xsd:simpleType>

</xsd:element> </xsd:element>

En este ejemplo, el valor del campo “password” debe En este ejemplo, el valor del campo “password” debe ser de 8 caracteresser de 8 caracteres

Esquemas XML – restricciones (ej. 9)Esquemas XML – restricciones (ej. 9)

<xsd:element name="password"><xsd:element name="password">

<xsd:simpleType> <xsd:simpleType>

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

<xsd:length value="8"/> <xsd:length value="8"/>

</xsd:restriction> </xsd:restriction>

</xsd:simpleType></xsd:simpleType>

</xsd:element></xsd:element>

Los elementos length, minLength y maxLength Los elementos length, minLength y maxLength permiten indicar el número exacto, mínimo y permiten indicar el número exacto, mínimo y máximo de caracteres que puede tener un valor de máximo de caracteres que puede tener un valor de un elemento.un elemento.

Elementos para restriccionesElementos para restricciones

enumerationenumeration Establece una lista de valores Establece una lista de valores “aceptados”“aceptados”

fractionDigits fractionDigits Número de cifras decimalesNúmero de cifras decimales

length length Número de caracteres Número de caracteres obligatoriosobligatorios

maxExclusive y maxInclusivemaxExclusive y maxInclusive Valor máximo de un rango Valor máximo de un rango

minExclusive y minInclusive minExclusive y minInclusive Valor mínimo en un rangoValor mínimo en un rango

maxLength y minLength maxLength y minLength Número máximo y mínimo de Número máximo y mínimo de caracteres permitidoscaracteres permitidos

pattern pattern Define una secuencia de Define una secuencia de caracteres permitidacaracteres permitida

totalDigits totalDigits Número exacto de dígitos Número exacto de dígitos permitidospermitidos

whiteSpace whiteSpace Indica cómo se deben de tratar Indica cómo se deben de tratar los espacios en blancolos espacios en blanco

XML Schema Limitaciones

► No soporta entidades. Mecanismo para crear macros <!ENTITY &texto; "Esto texto se repite muchas veces" > Es necesario seguir usando los DTDs

► Lenguaje de Restricciones limitado Ejemplo: ¿Verificar valor total = suma de valores parciales?

► Sensibilidad al contexto limitada Por ejemplo: Especificar que el contenido depende del valor de un atributo

<transporte tipo="coche"> ...</transporte><transporte tipo="avión"> ...</transporte>

► Tamaño de archivos XML Schema puede ser excesivo

► Legibilidad de las especificaciones...XML no siempre es legible

► Complejidad de la especificación: Muchas situaciones/combinaciones excepción

Práctica 1Práctica 1

► Diseñar un esquema XML para crear documentos para Diseñar un esquema XML para crear documentos para el préstamo.el préstamo.

► En cada documento se indicarán:En cada documento se indicarán:

El nombre y apellidos del bibliotecarioEl nombre y apellidos del bibliotecario Fecha del préstamo y de devoluciónFecha del préstamo y de devolución Datos del lector (id, nombre, apellidos, teléfono y Datos del lector (id, nombre, apellidos, teléfono y

dirección) La dirección se dividirá en tipo de calle dirección) La dirección se dividirá en tipo de calle (que puede ser calle, avenida o plaza), nombre calle, (que puede ser calle, avenida o plaza), nombre calle, número, piso y letra, c.p., localidad y provincianúmero, piso y letra, c.p., localidad y provincia

Un máximo de tres ejemplares en préstamo. Para Un máximo de tres ejemplares en préstamo. Para cada uno de ellos: el número de registro, título, cada uno de ellos: el número de registro, título, autor(es) autor(es)

El préstamo tendrá un atributo numérico que servirá El préstamo tendrá un atributo numérico que servirá como identificadorcomo identificador

Práctica 2Práctica 2

► Modificar un nuevo esquema, de forma que no todos Modificar un nuevo esquema, de forma que no todos los elementos estén anidados, utilizando las los elementos estén anidados, utilizando las referencias.referencias.

► Primero declaramos los elementos simples. Luego Primero declaramos los elementos simples. Luego declararemos los elementos complejos indicando su declararemos los elementos complejos indicando su “modelo de contenido” mediante atributos ref.“modelo de contenido” mediante atributos ref.

Práctica 3Práctica 3

► Crear un esquema xml para codificar datos de un Crear un esquema xml para codificar datos de un pedido a un proveedor. Se indicarán los datos del pedido a un proveedor. Se indicarán los datos del proveedor (nif, nombre, dirección, localidad, téléfono), proveedor (nif, nombre, dirección, localidad, téléfono), datos de la biblioteca, y el listado de items que se han datos de la biblioteca, y el listado de items que se han pedido.pedido.

► Para cada item se indicará el número de unidades, Para cada item se indicará el número de unidades, precio, y también el precio total del pedido y el precio, y también el precio total del pedido y el número de items.número de items.

► http://www.sidar.org/recur/desdi/traduc/es/xml/xmlschema/xmlschema-0es.html

► https://sites.google.com/site/todoxmldtd/home► Ejemplos:

http://xml.osmosislatina.com/curso/validar/elementos_schema.htm► https://sites.google.com/site/todoxmldtd/referenciiones-xml/referenci

a-de-xsds-xml-schema/7-definicion-de-tipos-de-datos-en-xml-schema-xsd