Page 1 sur 1

Exporter l'ODF en XML via PHP

Posté : 16 mars 2009 10:59
par Bidouille
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 43723 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.