Exporter l'ODF en XML via PHP

Quoi ? Vous ne connaissez pas cette suite bureautique libre et gratuite. Elle vous permet de faire ce que vous faîtes avec MS-Office sans avoir à pirater.
Bidouille
Webmestre
Messages : 391
Enregistré le : 21 mai 2007 16:08

Exporter l'ODF en XML via PHP

Messagepar Bidouille » 16 mars 2009 10:59

OpenOffice permet de lire tellement de formats (DOC, XLS, etc) qu'il sert souvent à des conversions en masse.
Bien souvent, je vois des développeurs s'escrimer avec des macros pour gérer les données de document.
Pourtant, le format ODF permet d'extraire et d'exporter le contenu très simplement.

Pourquoi ? Parce que l'ODF est un assemblage de XML compressé dans une archive en ZIP.
Cette archive comporte plusieurs fichiers et notamment le fameux content.xml qui comme son nom est le contenu.

_export.png
_export.png (235.86 Kio) Vu 4938 fois


Avec PHP, vous pouvez lire ce XML afin de générer un fichier plus lisible comme un CSV ou un script SQL par exemple.
Il existe 2 classes principales pour lire du XML :
  • SimpleXML qui lit l'intégralité du fichier en mémoire et le convertit en un objet. Ce processus n'est pas adapté aux fichiers de grande taille
  • XMLReader qui, au contraire, lit le fichier progressivement et permet d'effectuer les opérations nécessaires successivement sur chaque nœud.
A vous de voir quelle classe est la mieux adaptée à votre programmation suivant le ratio taille/nombre de documents à traiter.

Un exemple de traitement d'un ODT :

Code : Tout sélectionner

$odt = "test.odt";
$xml = new XMLReader();

$xml->open("zip://$odt#content.xml", "r");

while ($xml->read()) {
    if($xml->nodeType == XMLReader::END_ELEMENT) {
        continue;
    }
   
    if 
($xml->name == "text:h") {
        // Titre 1 (heading 1) devient <h1>
        // Titre 2 (heading 2) devient <h2>, etc...
        $level = $xml->getAttribute("text:outline-level");
        echo "<h$level>" . utf8_decode($xml->readString()) . "</h$level>";

    } elseif ($xml->name == "text:p") {
        echo "<p>" . utf8_decode($xml->readString()) . "</p>";
    }
}

On notera que depuis PHP 4.3.0, l'ouverture d'un ZIP est directe avec le support des flux de compression.

Retourner vers « OpenOffice »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité