miércoles, 16 de enero de 2008

Los documentos WordprocessingML

Ya hemos visto qué es y por qué nos interesaría usar OOXML, y presentamos sus componentes principales y tecnologías asociadas. Ahora vamos a explorar uno de sus tres lenguajes de marcas principales: WordprocessingML. Veremos su estructura, sus partes, elementos y relaciones; y cómo se almacena un documento de WordprocessingML dentro del contenedor.

Partes de un documento WordprocessingML
Como ya hemos dicho, un documento WordprocessingML tiene muchas partes relacionadas que se almacenan dentro de un contenedor. Actualmente se utiliza el formato ZIP para empaquetar y contener un documento WordprocessingML. Si renombramos un documento .docx a .zip podremos descomprimirlo y explorar internamente cada una de las partes del documento.


Figura 1: Estructura de un documento WordprocessingML

Ests estructura es definida por la especificación Open Packaging Conventions del formato OOXML. Como se muestra en la figura, el archivo.zip contiene una estructura de carpetas y archivos XML que forman las partes del documento. El contenido principal del documento se almacena en el archivo document.xml de la carpeta word y los demás archivos .xml (fontTable.xml, settings.xml, styles.xml, webSettings.xml) contienen información de estilos, fuentes, configuración, etc. El siguiente gráfico muestra un esquema de documento WordprocessingML y sus partes relacionadas:


Figura 2: Partes de un documento WordprocessingML

En la raíz del paquete .zip existe un archivo llamado [Content_Types].xml que describe todos los tipos de contenido para cada una de las partes dentro del paquete. El Content Type indica al consumidor del documento qué tipo de contenido debe ser esperado dentro del paquete.
Si continuamos explorando el archivo .zip, veremos una carpeta llamada _rels. Esta carpeta contiene un archivo XML con extensión .rels que describe las relaciones entre las diferentes partes del documento y permite unir el documento y sus partes.

En la carpeta docProps, encontraremos varios archivos XML como core.xml, app.xml y custom.xml. Estos archivos almacenan las propiedades del documento. Por ejemplo, el archivo core.xml contiene las propiedades generales aplicacables a todos los documentos de OOXML como Título, Asunto, Autor, etc. EL archivo app.xml contiene propiedades específicas del documento como Número de páginas, Número de líneas de texto, Versión de la aplicación, etc. Finalmente, el archivo custom.xml contiene propiedades personalizadas agregadas por el autor o usuario del documento.

Archivos binarios
El formato XML no soporta nativamente los datos binarios como imágenes u objetos OLE. OOXML almacena los datos binarios en como partes binarias en su formato nativo. Si examinamos la carpeta media encontraremos las imágenes y objetos binarios que han sido incluidos en el documento.

Un documento WordprocessingML básico
Si quisiéramos crear un documento WordprocessingML básico, necesitaríamos al menos 3 partes:

  1. Un archivo document.xml que contiene el cuerpo principal del documento.

  2. Un archivo [Content_Types].xml que describe los tipos de contenidos incluidos en el paquete.

  3. Un archivo .rels que define las relaciones entre las diferentes partes y permite ubicar cada parte dentro del paquete.

Figura 3: Documento Wordprocessing básico

La parte de inicio, document.xml
El primer elemento al crear un documento de OOXML es la parte de inicio (start-part). Este es el lugar donde los consumidores empezarán a parsear el contenido del documento. Los 3 lenguajes de marcas principales de OOXML (WordprocessingML, SpreadsheetML, PresentationML) contienen dentro del archivo ZIP una parte considerada como la parte de inicio. En WordprocessingML la parte de inicio es el archivo document.xml y es usado para almacenar el contenido principal del documento.

La siguiente figura muestra un ejemplo del contenido de un archivo document.xml:


Figura 4: Contenido de document.xml

Se puede observar una estructura XML bastante sencilla para formar un documento. Dentro del elemento document se puede crear los bloques de construcción del documento como párrafos, tablas y gráficos. Muchos de estos elementos utilizan el mismo identificador de espacio de nombres XML. Microsoft Office 2007 utiliza el prefijo w. Podemos usar cualquier otro prefijo, pero debemos mantener el espacio de nombres XML de WordprocessingML:

http://schemas.openxmlformats.org/wordprocessingml/2006/main

Los tipos de contenidos, [Content_Types].xml
Los consumidores de OOXML necesitan saber qué tipos de contenidos existen dentro del paquete. La lista de tipos de contenidos está definida dentro del archivo [Content_Types].xml que debe estar ubicado en la raíz del contenedor.
Los tipos de contenidos se identifican de dos formas:

  1. Utilizando la extensión del archivo de partes dentro del paquete.

  2. Especificando la ubicación y tipo de contenido del archivo dentro del paquete.
La siguiente figura muestra el contenido de un archivo [Content_Types].xml:


Figura 5: Contenido de [Content_Types].xml

Se puede ver claramente las dos estrategias utilizadas para identificar y definir los tipos de contenidos de cada parte dentro del paquete. Dentro del elemento Types se puede crear dos elementos, Default y Override. En el ejemplo, el elemento Default asocia la extensión xml con el tipo de contenido application/xml, y de forma similar puede observarse el tipo de contenido asociado a los archivos rels y los archivos png.

Anteriormente, hablamos del archivo document.xml , que es la parte de inicio y contiene el cuerpo principal del documento. Como la extensión de este archivo es xml, el elemento default, del archivo de tipos de contenidos, indicaría que se trata de un simple archivo de tipo application/xml, sin embargo este archivo es especial y debe ser definido como tal. Para ello se utiliza el elemento Override, para sobrescribir la asociación de tipos por defecto y especificar el tipo de contenido asociado en forma explícita.

En el ejemplo, existe un elemento Override que asocia el archivo /word/document.xml con el tipo de contenido application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml. Este mismo enfoque se utiliza para definir el tipo de contenido de las partes restantes del documento.

Las relaciones entre partes
Otro elemento requerido en un documento Wordprocessing, es el archivo de relaciones entre partes. En el archivo .zip existe una carpeta _rels que contiene un archivo .rels. Este es un archivo XML que define las relaciones y ubicación de las partes principales del paquete.

La siguiente figura muestra el contenido del archivo .rels:


Figura 6: Contenido del archivo .rels

El elemento Relationship contiene tres piezas básicas de información:

  1. ID: Un identificador único para la relación.

  2. Type: define el tipo de relación.

  3. Target: especifica la ubicación del elemento o parte relacionada.

Debe observarse que no hay información sobre el origen (Source) de la relación. En este caso, el origen de la relación es implícito y relativo a la raíz del paquete.

Además del archivo .rels principal, dentro de la carpeta word/_rels existe un archivo document.xml.rels que define las partes relacionadas al documento.xml como el encabezado, pie, estilos y fuentes.

Utilizando el attributo type y target del archivo .rels, los consumidores de documentos OOXML pueden localizar el documento principal (start-part), y, luego, usando el archivo de relaciones asociado al documento principal (document.xml.rels), es posible ubicar el encabezado y pie, encontrar las imágenes y otras partes relacionadas al documento.


Hasta aquí hemos visto las partes principales de un documento de WordprocessingML, su formato y estructura. En la próxima entrega empezaremos a hacer ejercicios y veremos cómo crear y empaquetar esas partes en forma manual y en forma programatica, utilizando la API de Packaging (System.IO.Packaging) incluida en .NET 3.0.

2 comentarios:

Anónimo dijo...

muy ilustrativo, gracias

Anónimo dijo...

me sirvio de muchisima ayuda, muchas gracias por el aporte