La structure d’un document OpenXML
Julien Chable, étudiant à l’EFREI et Microsoft Student Partner est à l’origine de plusieurs articles sur Java et .NET dans des magazines orientés vers le développement. Il est également administrateur du réseau communautaire CodeS SourceS et peut être contacté via son site ou son blog.
Cet article se base sur la version 1.3 des schémas.
.gif)
Sur cette page
Introduction
L’arrivée du format de document Office 2007, le très attendu OpenXML, montre à nouveau la volonté de Microsoft de consolider son engagement envers l’interopérabilité. Contrairement à ses prédécesseurs, ce nouveau format se veut complètement ouvert : spécifications ouvertes et utilisation de standards ouverts (ZIP, XML, XMLSchema, PNG, …). D’ailleurs ce dernier point est particulièrement intéressant pour les développeurs puisque tous ces standards sont supportés par la plupart des technologies : .NET, Java, PHP, C/C++, Python, ... de quoi ouvrir de nouveaux et nombreux horizons !
En ce qui concerne le format, il est intéressant de voir que OpenXML adopte désormais le concept de la séparation du contenu et de la présentation : les données – texte, image, multimédia, … - sont chacunes stockées indépendamment des styles et autres informations de présentation. Ce sont les relations entre les données de contenu et celles de présentation qui vont permettre de savoir où et comment les ressources s’afficheront au final dans votre document.
Dans cet article, nous allons voir comment est structuré un document OpenXML en nous intéressant de près à son conteneur : le paquet ou package en anglais. Tous les exemples seront réalisés en Java avec un document d’exemple Word.
Fondamentalement, un document OpenXML est un fichier Zip compressé, il peut donc être ouvert avec n’importe quel outil de compression gérant ce format. Chaque fichier que renferme l’archive Zip est une partie du document - les données de son contenu -, chaque partie est reliée à une autre à l’aide d’une relation. Afin de bien assimiler ces différents éléments qui constituent un document OpenXML, nous allons décomposer cet article en plusieurs parties - une pour chaque grande notion –selon l’ordre suivant : le paquet, les parties, les relations et enfin les objets embarqués.
Haut de pageLe paquet
Un paquet OpenXML se présente sous la forme d’une archive Zip contenant un ensemble de fichiers compressés, chaque fichier est une partie du paquet. Si vous êtes sur Windows XP ou Windows Vista, vous pouvez renommer les fichiers .docx en .zip pour afficher son contenu, sinon utiliser un utilitaire Zip.
Voici la hiérarchie complète ainsi qu’un aperçu du fichier d’exemple que nous utilisons pour nos exemples :
.jpg)
.jpg)
Haut de pageLes parties et le type de contenu
Une partie possède plusieurs propriétés qu’il est important de bien connaître :
| • | un URI : sa location dans le paquet |
| • | un identifiant unique : utilisé par les références dans les documents |
| • | un type de contenu : le fameux content-type MIME. |
C’est la dernière propriété que le fichier [Content_Types].xml renseigne, c'est-à-dire l’information qui permet de savoir quelle est la véritable nature d’une partie : est-ce un contenu XML ? est-ce une image ? l’image est-elle de type jpeg ou png ? ...
Voici un exemple de fichier [Content_Types].xml :
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" />
<Default Extension="xml" ContentType="application/xml" />
<Default Extension="png" ContentType="image/png" />
<Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" />
<Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml" />
<Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml" />
...
</Types>
Nous constatons qu’il existe deux éléments de type différent : default et override. Le type default possède un attribut nommé Extension et un autre ContentType. Ce type indique que tous les fichiers possédant une extension égale à la valeur de l’attribut Extension sont associés au type de contenu renseigné par l’attribut ContentType. Le type override permet de spécifier un type de contenu différent de celui spécifié par le type par défaut. Par exemple dans le fichier ci-dessus, la partie /docProps/core.xml est un fichier dont l’extension est .xml, mais dont le type de contenu le définit comme un fichier de propriétés et non uniquement comme un simple fichier XML. Le type override comprend donc naturellement deux propriétés, l’attribut PartName qui spécifie l’URI de la partie concernée, et l’attribut ContentType qui définit le type de contenu spécifique de cette partie.
Haut de pageLes relations
Vous vous demandez surement comment Office 2007 arrive à retrouver les différentes parties afin de recomposer le document dans son intégralité ? Tout simplement, grâce aux fameuses relations dont nous évoquions la présence depuis le début mais sans jamais nous attarder dessus. Les relations peuvent être assimilées au « ciment » qui assure la cohésion du document en stockant tous les liens entres les différentes parties du package. Il existe deux types de relations : les relations de package (lient une partie à un package) et les relations de partie (lient une partie à une autre).
Un fichier de relations se trouve par convention dans un répertoire _rels, situé directement à la racine de la source de la relation, et porte l’extension .rels. Le nom complet du fichier de relation est composé du nom du fichier auquel les relations dépendent suivi de cette extension. Par exemple, le contenu d’un document Word possédant un URI word/document.xml sera associé à un fichier de relations ayant l’URI : word/_rels/document.xml.rels.
Fichier de relation du package
Le fichier de relation du package possède l’URI _rels/.rels, sa présence est tout aussi obligatoire que celle du fichier [Content_Types].xml. Ce fichier constitue le point de départ de l’exploration du document : il nous informe de l’emplacement du contenu principal et des propriétés du document, et pour certains types de document, par exemple PowerPoint, d’une image d’aperçu.
.jpg)
Voyons comment est structuré un fichier de relations, celui du package par exemple :
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId3"
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties"
Target="docProps/app.xml" />
<Relationship Id="rId2"
Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties"
Target="docProps/core.xml" />
<Relationship Id="rId1"
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
Target="word/document.xml" />
</Relationships>
Le contenu de ce fichier de relations nous apporte plusieurs informations, à savoir dans un premier temps, la composition d’une relation : un identifiant unique, un type et enfin l’URI du fichier cible ; et dans un second temps, des informations sur la structure du document, puisque nous constatons l’existence d’un fichier de propriétés core.xml et d’un autre de propriétés étendues app.xml (nous reviendrons sur ces fichiers dans le prochain article traitant des documents). La troisième relation word/document.xml est celle de la partie du contenu principal du document sur lequel nous reviendrons dans la deuxième partie de cet article.
Une relation possède aussi une autre propriété, qui n’apparaît pas dans notre exemple car sa présence est optionnelle, c’est l’attribut TargetMode qui spécifie si la cible est une ressource interne au document - comportement par défaut - ou alors externe.
Fichier de relations d’une partie
Maintenant que nous avons récupéré les relations au niveau du paquet, notamment la relation vers la partie principale du contenu du document (dans notre exemple : word/document.xml), nous allons pouvoir extraire toutes les relations des ressources associées à cette partie en consultant son fichier de relations :
.jpg)
Haut de page
Les objets embarqués
La grande flexibilité du format OpenXML vous donne la possibilité d’embarquer n’importe quel objet dans le document, aussi bien textuel que binaire, sans avoir recours au pénible et limité encodage Base64.
Par exemple, si vous décidez d’ajouter une image de type PNG ou JPG dans un document, voici les étapes que réalisera un générateur de documents OpenXML tel que Office 2007 :
- Un type de contenu (image/png ou image/jpg) est ajouté au fichier de types de contenu [Content_Types].xml en le liant à l’extension .png ou .jpg selon le type d’image,
- Un répertoire media est créé, s’il n’existe pas déjà, et le fichier PNG ou JPG est stocké à cet endroit,
- La structure XML du fichier word/document.xml est modifiée afin d’ajouter une référence vers une nouvelle relation,
- Cette nouvelle relation est créée dans le fichier de relations document.xml.rels, en ajoutant un élément Relationship avec l’ID de référence, le type de la relation et la partie à laquelle la relation fait référence, ici l’image.
Haut de pageConclusion
Voici une vue globale de la strucure d’une document au format OpenXML.
Si vous désirez commencer à le manipuler, passez à la 3ème étape
Haut de page