Antes de Empezar: XML Básico
Este capítulo explica las características básicas de XML que usaremos en esta guía. Si ya entiendes
el XML sencillo, puedes saltar al próximo capítulo.
¿Qué es XML?
XML viene de eXtensible Markup Language, un lenguaje desarrollado por el Consorcio de la World Wide Web (W3C).
XML es realmente un metalenguaje; un lenguaje que describe otros lenguajes. XML permite que describamos otros lenguajes con el uso
de las etiquetas extensibles, que agregan la estructura y el significado a los documentos. Aunque las etiquetas XML parecen
etiquetas HTML, describen el contenido en vez del formato del texto que contienen. Más importante, las etiquetas XML son extensibles,
lo que significa que podemos definir nuestras propias etiquetas para describir mejor un contenido determinado.
Los dos partes de una típica aplicación XML son el Document Ttype Definition (DTD) y un conjunto de ejemplares
de documentos XML, que son especificados por el DTD. El DTD es un esquema que contiene las definiciones de etiquetas que utilizamos
en nuestros documentos XML especificando lo que puede contener un conjunto de etiquetas. Las DTDs definen y declaran etiquetas y
especifican su contenido; por lo tanto, cada DTD es esencialmente una especificación del lenguaje, y los documentos XML que un DTD
especifica están escritos en ese lenguaje de DTDs. La especificación XML 1,0 no requiere un DTD; los analizadores de sintaxis pueden
reconocer etiquetas en un documento XML y procesar los datos, pero sin un DTD no puede verificar su validez.
Al contrario que la especificación XML 1,0, las facilidades de JAXB requieren que proporcionemos un DTD para
construir una aplicación JAXB. El compilador de esquema JAXB utiliza las restricciones
especificadas en el DTD para construir las clases Java. Esta sección discute solamente las características básicas de los DTDs y
los documentos XML que son utilizados en los ejemplos de esta guía.
Definición de Tipo de Documento
Una definición de tipo de documento se conoce más comunmente como DTD. Un DTD define la estructura y el contenido de los documentos
XML que especifica. Un DTD consiste en una lista de declaraciones, cada una de los cuales define un bloque de construcción de un
documento. Los declaraciones básicas son declaraciones de elemento y declaraciones de atributo. Los declaraciones de elemento
definen lo que puede contener un conjunto determinado de etiquetas en un documento XML. Los declaraciones de atributo acompañan a las
declaraciones de elemento y proporcionan información adicional sobre el elemento.
Declaración de Elemento
Una declaración de elemento comienza con <!ELEMENT y especifica el contenido de la
etiqueta definida por este elemento. En XML, una etiqueta es la realización de un elemento en un documento. Por ejemplo, si
book es un elemento, su etiqueta será lt;book>.
Todos los documentos deben tener al menos un nodo raíz, que no está contenido por ningún otro elemento declarado en el
DTD del documento. Por ejemplo, supongamos que tenemos un DTD que especifica un libro. El DTD contiene una declaración
como esta:
<!ELEMENT book (titlepage, (prologue | preface), toc, chapter+, epilogue?, appendix*) >
La parte de la declaración entre los paréntesis externos especifica lo que puede contener un book
y se llama el modelo contenido. Las comas se llaman conectores de secuencia; dictan que los elementos deben aparecer
en el documento XML en el orden listado. En este caso, un book contiene por este orden: un título,
un prólogo o un prefacio, un índice, uno o más capítulos, un epilogo opcional, y cero o más apéndices. La parte del
modelo de contenido en el conjunto interno de paréntesis representa un grupo modelo. Este grupo modelo utiliza un
conector de elección, |, dictando que solamente uno de los elementos del grupo puede
aparecer en un ejemplar del elemento padre en el documento XML. En este caso, cualquier ejemplar del elemento
book puede contener solamente un prólogo o un prefacio, pero no ambos. +,
*, y ? se llaman indicadores de ocurrencia. El
+ después del capítulo indica que están permitidos uno o más capítulos. El
? después del epilogo significa que el epilogo es opcional. El
* después del apéndice indica que están permitidos cero o más de estos elementos. Los
elementos que tienen * o + algunas veces se les llama
repetibles.
Cada una de estas partes de contenido de un elemento book también son elementos, y también deben
ser declarados:
<!ELEMENT titlepage (title, author) >
<!ELEMENT prologue (#PCDATA) >
<!ELEMENT preface (#PCDATA) >
<!ELEMENT toc (chaptitle+, appendixtitle*) >
<!ELEMENT chaptitle (#PCDATA) >
<!ELEMENT appendixtitle (#PCDATA) >
<!ELEMENT title (#PCDATA) >
<!ELEMENT author (#PCDATA)>
<!ELEMENT chapter (chaptitle, body) >
<!ELEMENT body (#PCDATA) >
<!ELEMENT epilogue (#PCDATA) >
<!ELEMENT appendix (appendixtitle, body) >
La notación #PCDATA viene de Parseable Character DATA. PCDATA
representa cero o más caracteres. El contenido de cualquier elemento contiene PCDATA, otros elementos, o una combinación
de ambos. Un elemento cuyo contenido está definido para tener solamente PCDATA sólo puede contener texto. Como dicho elemento
es esencialmente el denominador común más bajo de un DTD: no puede ser dividido.
Como podemos ver desde estos ejemplos de declaraciones de elementos, especificar el contenido de un elemento puede ser una tarea
complicada y propensa al error. Debemos tener cuidado de no especificar un contenido que pudiera ser ambiguo y confundir el analizador
de sintaxis. Por ejemplo, si debemos incluir los conectores de elección y los conectores de secuencia en un grupo modelo, necesitamos
utilizar paréntesis para separar el contenido que usa una regla de conector del resto del grupo que utiliza el otro conector. Este
caso se muestra en el declaración siguiente de elemento en el cual el grupo (prologue | preface)
utiliza un conector de elección, pero el resto de los modelos de grupo usan un conector de secuencia.
<!ELEMENT book (titlepage, (prologue | preface), toc, chapter+, epilogue?, appendix*) >
Declaración de Atributo
Al contrario que las declaraciones de elemento, las declaraciones de atributo son opcionales en un DTD. Las declaraciones de
atributos acompañan a las declaraciones de elemento y proporcionan información adicional sobre el elemento. Por ejemplo,
podemos añadir un atributo al elemento book que describa su tipo:
<!ELEMENT book (titlepage, (prologue | preface), toc, chapter+, epiloque?, appendix*) >
<!ATTLIST book type ( fiction | travel | history | biography ) #REQUIRED >
Un declaración de atributo incluye el nombre del elemento al cual se aplica. Después del nombre del elemento, se declara una lista con
los nombres del atributo. En este caso, hay solamente un atributo, que se llama type. Después del nombre
del atributo están los posibles valores a los cuales se puede fijar el atributo. En este caso, el tipo de libro puede ser uno de
cuatro tipos. La palabra clave #REQUIRED indica que el atributo del tipo debe ser utilizado siempre
cuando el elemento book se utiliza en un documento XML. Si el atributo type fuera
opcional, #REQUIRED sería substituido por #IMPLIED.
La siguiente sección explica como se realiza está declaración de atributo en un documento XML.
Documentos XML
Un documento XML es un fichero de texto que contiene las etiquetas de marcas XML, que son pedazos de texto rodeados de una
etiqueta de inicio y una etiqueta de fin. Las etiquetas de inicio y de cierre y el texto encerrado conforman un elemento, que es
declarado en un DTD. Por ejemplo, consideremos nuestra declaración anterior del elemento chaptitle:
<!ELEMENT chaptitle (#PCDATA) >
En un documento XML, esta declaración podría representarse como:
<chaptitle>The Early Years</chaptitle>
Estas etiquetas XML parecen similares a las etiquetas HTML, pero son diferentes de forma significativa: las etiquetas XML son
extensibles e indican el significado del texto incluido dentro de ellas. Por ejemplo, no podríamos definir una etiqueta
<chaptitle> en HTML; deberíamos utilizar las etiquetas definidas ya en la especificación
HTML, y un conjunto de etiquetas HTML puede definir solamente el formato del texto que incluye. La etiqueta
<chaptitle> puede indicar a un analizador de sintaxis que la información contenida dentro de
ella es un título de un capítulo, lo que permite que hagamos muchas más cosas con sus datos, incluyendo buscar y archivar. Si
tenemos un DTD que delare un elemento chaptitle, también podemos restringir qué tipos de datos puede contener
un chaptitle.
Este documento XML está en relación con el DTD descrito en la sección Definición de Tipo
de Documento:
<!DOCTYPE Duke SYSTEM Book.DTD>
<book type=biography>
<titlepage>
<title>Duke: My Life and Times</title>
<author>Duke</author>
</titlepage>
<prologue>I dedicate this book to ...</prologue>
<toc>
<chaptitle>The Early Years</chaptitle>
<chaptitle>The Later Years</chaptitle>
</toc>
<chapter>
<chaptitle>The Early Years</chaptitle>
<body>Blah blah blah</body>
</chapter>
<chapter>
<chaptitle>The Later Years</chaptitle>
<body>Blah blah</body>
</chapter>
</book>
La declaración DOCTYPE de la parte superior del documento dice al analizador de sintaxis
que el ejemplar del documento se debe adherir a las reglas definidas en el DTD book. El elemento
book tiene un tipo de biografía, indicando que este documento XML representa un libro que es una biografía.
El elemento raíz, el elemento book debe encerrar todo el documento, lo que significa que el documento
debe terminar con </libro>, y no se puede contener ninguno otro elementos fuera de las
etiquetas del elemento book. Observa que el documento contiene más de un elemento chapter.
En el DTD book, el signo más que sigue a la declaración de elemento chapter
indica que un book puede contener uno o más capítulos. Observa también que este documento no contiene ningún
epílogo. El signo de interrogación después de la declaración de epilogue especifica que un epílogo es opcional.
Después de esta breve lección de XML, deberíamos poder construir una sencilla aplicación JAXB.