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 WordprocessingMLEsts 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 WordprocessingMLEn 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 binariosEl 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:
- Un archivo document.xml que contiene el cuerpo principal del documento.
- Un archivo [Content_Types].xml que describe los tipos de contenidos incluidos en el paquete.
- 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.xmlEl 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.xmlSe 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/mainLos tipos de contenidos, [Content_Types].xmlLos 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:
- Utilizando la extensión del archivo de partes dentro del paquete.
- 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].xmlSe 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 .relsEl elemento
Relationship contiene tres piezas básicas de información:
- ID: Un identificador único para la relación.
- Type: define el tipo de relación.
- 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.