
La necesidad de jerarquizar y estructurar correctamente la
información, no sólo para almacenarla, sino también para acceder a ella, se ha
convertido en una labor que ha cobrado especial relevancia en los últimos años,
en los que se han producido importantes avances en este campo.
Inicialmente se usaron las Definiciones del Tipo de
Documento (DTDs) en el lenguaje SGML
para describir el vocabulario necesario para identificar todos
los elementos de que iba a constar el documento y para expresar la estructura. La aparición y el desarrollo del lenguaje XML, hizo
que este lenguaje incorporara también las
DTDs,
no en vano, hay que recordar que el lenguaje XML no es sino un subconjunto del lenguaje
SGML.
Pero las
DTDs no
satisficieron todas las necesidades inherentes a XML y pronto se vio necesario
utilizar otros métodos más rigurosos y sofisticados para tratar la estructura
y la semántica dentro de un documento XML. Así surgieron los Esquemas XML (XML Schema),
como una forma de ampliación y mejora de las primitivas DTDs. Las DTDs y los
Schemas son usados por los analizadores sintácticos o
parsers para comprobar si un documento XML es válido.
Así pues, vemos que para
proceder a la estructuración
o especificación formal dentro de un documento XML existen distintas soluciones,
entre las que cabe destacar principalmente dos: las DTDs y los XML Schemas.
Pero veamos con
más profundidad las diferencias entre la utilización de DTDs y Esquemas.
La Declaración de Tipo de Documento (DTD-Document Type Data):
Al definir el lenguaje XML ya nos
referimos a la Definición del Tipo de Documento (Document
Type Definition DTD)
que, en resumen, cumple las siguientes funciones:
- Una DTD especifica la clase de documento
- Describe un formato de datos
- Usa un formato común de datos
entre aplicaciones
- Verifica los datos al
intercambiarlos
- Verifica un mismo conjunto de
datos
- Una DTD describe
- Elementos: cuáles son las etiquetas permitidas
y cuál es el contenido de cada etiqueta
- Estructura:
en qué orden van las etiquetas en el documento
- Anidamiento: qué etiquetas van dentro de cuáles
Los elementos de una DTD son los siguientes:
- Elementos con
“contenido ELEMENT”:
- Un elemento tiene contenido ELEMENT, si
solo puede contener a otros elementos, opcionalmente separados por espacios
en blanco.
- Elementos con “contenido TEXT”
- Un elemento tiene contenido TEXT, si solo puede
contener texto
- (PCDATA = printable character data)
- Elementos con “contenido MIXED”
- Un elemento tiene contenido MIXED, si puede contener texto u otros
elementos
- Elementos con “contenido EMPTY”
- Un elemento tiene contenido EMPTY, si no puede contener otros
elementos
Y los atributos son los siguientes:
- CDATA: texto
- NMTOKEN: “abc...z0123..9-_:.” (tipo de
lista)
- NMTOKENS: NMTOKEN + espacios
- ID: empezar con letra
- IDREF: ser un ID
Así pues, la DTD
especifica la clase de documento XML. Una DTD indica sólo qué
elementos, atributos, etc; tiene un documento y cómo se anidan, pero no dice
nada acerca de tipos de dato. El único tipo de dato que conoce es
CDATA (texto
plano), por tanto, las DTDs se quedan algo cortas y cuando se necesita algo más
potente y rígido, se usa Schema
Recordemos que una DTD se
puede guardar en un archivo de texto, como por ejemplo, en el archivo "list.dtd".
Una DTD muy simple es la
siguiente:
<!ELEMENT List (Item)+>
<!ELEMENT Item (#PCDATA)>
<!ATTLIST Item
id CDATA IMPLIED
color CDATA IMPLIED>
<!ELEMENT Separator EMPTY>
Veamos
ahora el documento .xml que hace referencia a esa DTD:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE list SYSTEM "list.dtd">
<List>
<Item>París</Item>
<Item>Madrid</Item>
<Separator />
<Item
color="rojo">Londres</Item>
</List>
XML Schema:
Al igual que las DTDs, los Schemas
describen el contenido y la estructura de la información, pero de una forma más
precisa.
Los esquemas indican tipos
de dato, número mínimo y máximo de ocurrencias y otras características más
específicas.
Según la Especificación
del W3C XML Schema (http://www.w3.org/XML/Schema), los esquemas expresan vocabularios compartidos que permiten a las máquinas
extraer las reglas hechas por las personas. Los esquemas proveen un significado para definir la
estructura, contenido y semántica de los documentos XML.
Un esquema XML (XML
schema) es algo similar
a un DTD, es decir, define qué elementos puede contener un documento XML, cómo
están organizados, y qué atributos y de qué tipo pueden tener sus elementos,
pero la utilización de schemas ofrece nuevas posibilidades en el tratamiento
de los documentos.
La ventaja de utilizar los schemas con respecto a los DTDs
son:
- Usan sintaxis de XML, al contrario que los
DTDs.
- Permiten especificar los tipos de datos.
- Son extensibles (esto es, permite crear
nuevos elementos).
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, una cadena de texto, una fecha, etc. Las DTDs no
nos permiten hacer estas cosas.
Veamos un ejemplo de un documento XML, y su schema
correspondiente:
<documento xmlns="x-schema:personaSchema.xml">
<persona id="fulanito">
<nombre>Fulano Menganez</nombre>
</persona>
</documento>
Como podemos ver en el documento XML
anterior, se hace referencia a un espacio de nombres
(namespace) llamado "x-schema:personaSchema.xml". Es decir, le estamos
diciendo al analizador sintáctico XML (parser) que valide el documento
contra el schema "personaSchema.xml".
El schema sería algo parecido a esto:
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes">
<AttributeType name='id' dt:type='string' required='yes'/>
<ElementType name='nombre' content='textOnly'/>
<ElementType name='persona' content='mixed'>
<attrubyte type='id'/>
<element type='nombre'/>
</ElementType>
<ElementType name='documento' content='eltOnly'>
<element type='persona'/>
</ElementType>
</Schema>
El primer elemento del schema
define dos espacios de nombre. El primero
"xml-data"
le dice al analizador (parser) que esto es un schema y no otro
documento XML cualquiera. El segundo "datatypes" nos permite definir el tipo de
elementos y atributos utilizando el prefijo "dt".
-
ElementType:
Define el tipo y contenido de un elemento, incluyendo los sub-elementos que
pueda contener.
-
AttributeType:
Asigna un tipo y condiciones a un atributo.
-
attribute:
Declara que un atributo previamente definido por AttributeType
puede aparecer como atributo de un elemento determinado.
-
element:
Declara que un elemento previamente definido por ElementType
puede aparecer como contenido de otro elemento.
Así pues, es necesario empezar el
schema definiendo los elementos más profundamente anidados dentro de la
estructura jerárquica de elementos del documento XML. Es decir, tenemos que
trabajar "desde dentro hacia fuera", o lo que es lo mismo, las declaraciones de
tipo ElementType
y AttributeType
deben preceder a las declaraciones de contenido element y
attribute
correspondientes.
Un esquema también puede verse como una colección
(vocabulario) de definiciones de tipos y declaraciones de elementos cuyos
nombres pertenecen a un determinado espacio de nombres
llamado espacio de nombres de destino. Los espacios de nombres de destino hacen
posible la distinción entre definiciones y declaraciones de diferentes
vocabularios. Por ejemplo, los espacios de nombres de destino facilitarían la
declaración del elemento
element
en el vocabulario del Esquema XML, y la declaración de
element
en un hipotético vocabulario de lenguaje químico. El primero es parte de espacio
de nombres de destino
http://www.w3.org/2001/XMLSchema, y el segundo es
parte de otro espacio de nombres de destino.
Además, a medida que los esquemas se hacen más grandes, es
posible y deseable dividir su contenido entre varios documentos esquema con el
fin de facilitar su mantenimiento, control de acceso, y legibilidad.
Las Recomendaciones establecidas por el
W3C en relación a
los esquemas XML son las siguientes:
-
XML Schema Part 0: Primer.
Es un documento no normativo que pretende ofrecer una fácil descripción de las
funcionalidades de XML Schema y que está orientado a comprender de forma
rápida cómo crear esquemas utilizando el lenguaje XML Schema.
http://www.w3.org/TR/xmlschema-0/
-
XML Schema Part 1: Structures.
Especifica la definición del lenguaje XML Schema y ofrece las
herramientas para describir la estructura y constreñir el contenido de los
documentos de XML 1.0, incluyendo las que tratan los
espacios de nombre (XML Namespace). El lenguaje de
esquemas que se representa en XML usa espacios de nombre,
reconstruye sustancialmente y extiende las capacidades de las DTDs de los documentos del lenguaje XML 1.0.
http://www.w3.org/TR/xmlschema-1/
-
XML Schema Part 2: Datatypes.
Establece las herramientas para definir los tipos de datos que se usan en los
esquemas XML y en otras especificaciones XML. El lenguaje de tipo de datos que
se representa en XML 1.0, ofrece un conjunto de capacidades que se encontraban
en las DTDs en XML 1.0
para especificar tipos de datos sobre elementos y atributos.
http://www.w3.org/TR/xmlschema-2/
DTD versus Schema
Las limitaciones de la DTD
son las siguientes:
-
Posee un
lenguaje propio de escritura lo que ocasiona problemas a la hora del
aprendizaje, pues no sólo hay que aprender XML, sino también conocer el
lenguaje de las DTDs.
-
Para
el procesado del documento, las herramientas y
analizadores (parsers) empleados para tratar los documentos XML deben ser capaces de procesar
también las DTDs .
-
No permite el uso de
namespaces y estos son muy útiles ya que permiten definir elementos con igual nombre dentro del
mismo contexto, siempre y cuando se anteponga un prefijo al nombre del
elemento.
-
Tiene una tipología para los
datos del documento extremadamente limitada, pues no permite definir el que un
elemento pueda ser de un tipo número, fecha, etc. sino que sólo presenta
variaciones limitadas sobre cadenas.
-
El mecanismo
de extensión es complejo y frágil ya que está basado en sustituciones sobre
cadenas y no hace explicitas las relaciones, es decir, que dos elemento que tienen definido el mismo modelo de
contenido no presentan ninguna relación.
Estos problemas son superados gracias a la especificación de
XML Schema, ya que los esquemas permiten un lenguaje mucho más expresivo y
un intercambio de información mucho más robusto. Pero, aparte de solventar los problemas antes expuestos,
XML Schema, permite una serie de ventajas adicionales:
-
XML
Schema presenta una estructura de tipos
mucho más rica. En la segunda parte de la especificación de XML Schema
(XML Schema Part 2: Datatypes) se definen los tipos base que se pueden
emplear dentro de esquema de XML, como ejemplo podemos destacar: byte, integer,
bolean, string, date, sequence, etc. Este
sistema de tipos es muy adecuado para importar y exportar sistemas de
bases de datos y, sobre todo, distingue los
requerimientos relacionados con la representación léxica de los datos y el
conjunto de información dominante y subyacente.
-
Permite tipos definidos por
el usuario, llamados Arquetipos. Dando un nombre a estos arquetipos, se
pueden usar en distintas partes dentro del Schema.
-
Es posible agrupar
atributos, haciendo más comprensible el uso de un grupo de aspectos de varios
elementos distintos, pero con un denominador común, que deben ir juntos en cada
uno de estos elementos.
-
Es
posible trabajar con espacios de nombre, según la Especificación
XML Schema Part
0: Primer, permitiendo validar documentos con varios
namespaces.
-
Con XML Schema es
posible
extender Arquetipos de un modo específico, es decir permite lo que en
términos de orientación a objetos se llama herencia. Considérese un
esquema que extiende otro previamente hecho, se permite refinar la
especificación de algún tipo de elemento para, por ejemplo, indicar que puede
contener algún nuevo elemento del tipo que sea; pero dejando el resto del
esquema antiguo completamente intacto.
En la siguiente imagen
podemos comprobar la gran riqueza de los tipos de datos y la estructuración
jerárquica que ofrece XML Schema:

Fuente: W3C. XML Schema Part 2: Datatypes Second Edition.
http://www.w3.org/TR/xmlschema-2/
De las DTDs a XML
Schema
Como hemos afirmado anteriormente, en los inicios de XML se emplearon las DTDs
como modo de especificación de modelos, pero en la actualidad su uso ha quedado
algo restringido y lo normal es utilizar el de XML
Schema.
En la siguiente tabla se
puede ver la
correlación entre elementos de XML Schema y de DTDs, aunque existen herramientas de traducción (DTD2HTML
en Perl
http://www.w3.org/2000/04/schema_hack/), XMLSpy
http://www.xmlspy.com) entre estos 2
lenguajes.
|
DTD
|
XML Schema |
Comentarios
|
|
ELEMENT |
<element> |
Crea un vínculo entre un nombre y unos atributos, modelos de contenido y
anotaciones |
| #PCDATA |
Soportado como parte de un tipo simple |
|
| ANY |
<any> |
Posee distintos comodines para un mayor conjunto de
posibilidades. Existe también <anyAttribute> con comodines similares. |
| EMPTY |
Soportado |
Se elimina la existencia de elementos descendientes del actual,
diferenciando de la presencia de un string vacío en un elemento. |
| Modelo de Contenido |
<complexType> |
|
| , (Conector de secuencia) |
<sequence> |
|
| | (Conector de alternativas) |
<disjunction> |
|
| ? (Opcional) |
Soportado |
Se han de emplear los atributos predefinidos de maxOccurs y minOccurs |
|
+(Requerido y Repetible) |
Soportado |
Se han de emplear los atributos predefinidos de maxOccurs y minOccurs |
| *(Opcional y Repetible) |
Soportado |
Se han de emplear los atributos predefinidos de maxOccurs y minOccurs |
| ATTLIST |
<attributeGroup> |
Se pueden agrupar declaraciones de <attributes> |
| Tipo de atributo CDATA, ID, IDREF, NOTATION... |
Tipos <simpleType>predefinidos |
|
| ENTITY |
NO Soportado |
Las entidades son declaradas en declaraciones de marcas en el XML |
|
ENTITY%Parameter |
NO
Soportada |
Las
entidades paramétricas ofrecen un mecanismo de bajo nivel que permite
distintas cosas, algunas de estas se han intentado cubrir en XML
Schema:
-
..
La separación entre <element> y <complexType>
-
..
Grupos de atributos
-
..
Grupos de modelos con nombre
-
..
Mecanismos de extensión y restricción de tipos
-
..
Los mecanismos de <import> e <include> para componer
esquemas
-
..
El mecanismo de redefinición de elementos
|
En resumen, para
modelar y validar la información
existen muchas maneras de hacerlo, entre las que destacan el uso de DTDs y
de XML Schema,
entre otras. La utilización de XML Schema se ve favorecida por la facilidad de tratamiento que se deriva de la
escritura en XML, en lugar de emplear otros parsers para su
reconocimiento, y también porque el estándar está muy extendido.
Otra gran ventaja es que gracias a XML Schema se pueden
expresar un gran número de tipos de datos y jerarquizarlos. También es posible expresar la carga semántica y esto es muy importante para el
tratamiento de la información. Si gracias a XML se han
podido realizar intercambios de información entre aplicaciones de muy distinta
índole, mediante XML
Schema se ha podido validar y estructurar su contenido. Los esquemas XML
avanzan un paso más en la consecución de la Web
Semántica.
Existen numerosos esquemas, muchos de ellos
utilizan el lenguaje RDF escrito en XML, es decir
RDF Schema.
Por ejemplo,
FOAF: el proyecto "Friend Of A Friend" (amigo de un amigo)
http://www.foaf-project.org/
es una aplicación de
XML y
RDF. Básicamente es un
archivo XML (en realidad,
RDF
escrito en XML) con el cual se describen
personas,
documentos, etc.
FOAF se basa en la idea de que cuando
hablamos de describir a una persona, no estamos hablando de sus atributos físicos, sino de datos más profundos como: a quién conoce, de quién es amigo y
de quién no, cuáles son sus proyectos actuales y cuáles los pasados, etc. Todo,
o casi todo, puede ser definido en un archivo FOAF.
Leandro Mariano López
explica de forma sencilla en FOAF: el proyecto 'friend to
friend' en qué consiste este vocabulario. "Existen en el mundo cientos de miles de
personas que comparten los mismos atributos, como el nombre, color de ojos, pelo,
altura, intereses, etc. Sabiendo esto, ¿cómo podemos llegar a distinguir de
quién estamos hablando? ¿Cómo identificar de un modo unívoco a alguien? Como
FOAF es un proyecto basado en Internet, los desarrolladores buscaron algún
atributo propio de los usuarios de Internet, y lo encontraron: el
e-mail". FOAF se expresa como un
RDF Schema para expresar el hecho de que un
foaf:mbox únicamente se refiere a un individuo.
FOAF:mbox es una propiedad inambigua
(UnambiguousProperty).
De esta forma, el correo electrónico
personal se convierte en una propiedad no ambigua acerca de una persona, ya que
puede convertirse en identificador único de
alguien.
Otro ejemplo de este tipo de esquemas es el elaborado por
Leandro Mariano López: Esquema Habla, Lee y Escribe http://purl.org/net/inkel/rdf/schemas/lang/index.html
que permite identificar qué idiomas puede hablar, leer o escribir una persona. El esquema se
encuentra localizado en
http://purl.org/net/inkel/rdf/schemas/lang/1.1 Un ejemplo de implementación
puede encontrarse en el archivo FOAF, en
http://purl.org/net/inkel/inkel.foaf.rdf
Leandro Mariano López expresa de estas forma la
propiedades definidas por este esquema:
Declaración espacio de nombres:
xmlns:lang="http://purl.org/net/inkel/rdf/schemas/lang/1.1#"
-
lang:speaks
- Indica que la Persona puede hablar en este lenguaje
-
lang:reads
- Indica que la Persona puede leer este lenguaje
-
lang:writes
- Indica que la Persona puede escribir en este lenguaje
-
lang:masters
- Indica que la Persona puede hablar, leer y escribir en
este lenguaje
Se puede crear un perfil FOAF desde
http://my.opera.com/community/sparql/. Además, se ofrece una
interfaz que permite hacer búsquedas en toda la información pública.
Similar a FOAF es XFN (XHTML Friends
Network)
http://gmpg.org/xfn/
una manera muy simple para representar las relaciones humanas usando
hiperenlaces. Se utiliza mucho en la
blogosfera. XFN hace
posible que los autores web indiquen sus relaciones simplemente con añadir el
atributo rel a sus etiquetas <a
href>
Ejemplo:
<a href="http://jane-blog.example.org/"
rel="sweetheart date met">Jane</a>
<a href="http://dave-blog.example.org/" rel="friend met">Dave</a>
<a href="http://darryl-blog.example.org/" rel="friend met">Darryl</a>
<a href="http://www.metafilter.com/">MetaFilter</a>
<a href="http://james-blog.example.com/" rel="met">James Expert</a>
También existe otra iniciativa llamada
DOAP (Description of a Project)
http://usefulinc.com/doap/.
Se trata de un vocabulario XML/RDF para describir proyectos de software
libre que usa la URL del proyecto como clave
primaria. Con DOAP se pueden hacer descripciones semánticas del proyecto,
describir los recursos asociados, los participantes y los recursos web. Para
ello se utilizan algunas características ya empleadas en RSS,
FOAF o Dublin Core. DOAP puede
interoperar con todos estos esquemas de metadatos y
puede ser extendido para propósitos específicos.
Por su parte,
Charles McCathieNevile en El código EARL por ejemplos:
http://www.w3.org/2001/sw/Europe/talks/200311-earl/all.es
nos ofrece un vocabulario para describir si algo cumple con determinados requisitos. Por
ejemplo, si una página es accesible o cumple con determinadas pautas de
accesibilidad (WCAG).