PHP : générer un fichier xml à partir d’une base de données MySQL

PHP : générer un fichier xml à partir d'une base de données MySQL

Créer un fichier xml avec PHP peut se faire très facilement avec DOMDocument.

Imaginons que nous avons, dans notre base de données, une table livres qui contient les enregistrements suivants : 

TitreAuteurParution
The secret of loveHarold Klemp1997
The ProphetGibran Khalil Gibran1923
Stranger by the RiverPaul Twitchell1982

Nous voulons maintenant extraire ces données et générer un fichier xml tout en respectant la structure comme ceci :

<?xml version="1.0" encoding="utf-8"?>
<bibliotheque>
  <livre>
    <titre>The secret of love</titre>
    <auteur>Harold Klemp</auteur>
    <parution>1997</parution>
  </livre>
  <livre>
    <titre>The Prophet</titre>
    <auteur>Gibran Khalil Gibran</auteur>
    <parution>1923</parution>
  </livre>
  <livre>
    <titre>Stranger by the River</titre>
    <auteur>Paul Twitchell</auteur>
    <parution>1982</parution>
  </livre>
</bibliotheque>

Considérant que notre base de données s’appelle bibliotheque, nous allons nous connecter et récupérer les enregistrements. Il faut noter que les identifiants seront ceux d’un serveur local sur windows donc vous devrez les remplacer par vos identifiants propres selon si votre site est en local ou en ligne. [Plus de détails ici]

Le code ressemblera à ceci : 

<?php
    // Connexion à la base de données (identifiant pour un serveur local)
    $bd = new PDO("mysql:host=localhost;dbname=bibliotheque", "root", "");

    // Requête de sélection des enregistrements dans la table livres
    $r = $bd->query('SELECT * FROM livres');   
?>

Ensuite, pour créer un fichier xml, nous allons d’abord créer le document xml en instanciant la classe DOMDocument :

<?php
    $xmlFile = new DOMDocument('1.0', 'utf-8');
?>

Avec cette ligne, nous aurons :

<?xml version="1.0" encoding="utf-8"?>

Nous allons maintenant ajouter notre noeud principal bibliotheque dans notre document (au noeud racine). Pour ajouter un noeud XML, la méthode createElement() de la class DOMDocument est disponible. Aussi, la méthode appendChild() permet d’ajouter un noeud à un noeud parent.

<?php
    $xmlFile->appendChild($bibliotheque = $xmlFile->createElement('bibliotheque'));
?>

La variable $bibliotheque constitue le noeud bibliotheque créé et ce dernier est ajouté au noeud racine avec appendChild().

Maintenant, créons le noeud livre qui représente chaque livre avec ses infos. Vous l’avez deviné, il s’agira de l’insérer dans une boucle.

Nous allons parcourir à travers une boucle while les résultats de la requête de sélection et pour chaque ligne, il sera créé un noeud enfant livre qui sera rattaché au noeud parent bibliotheque. Ensuite, pour chaque information du livre, on va encore créer un noeud enfant (titre, auteur, parution) rattaché au noeud parent livre.

<?php
while($rs = $r->fetch(PDO::FETCH_ASSOC)){
    $bibliotheque->appendChild($livre = $xmlFile->createElement('livre'));
    $livre->appendChild($xmlFile->createElement('titre', $rs['titre']));
    $livre->appendChild($xmlFile->createElement('auteur', $rs['auteur']));
    $livre->appendChild($xmlFile->createElement('parution', $rs['parution']));
}
?>

A ce niveau, nous avons fini de créer notre structure XML mais si nous générons le fichier, il y’a de fortes chances qu’il ne soit pas indenté alors nous allons lui rajouter une ligne pour l’être.

<?php
    $xmlFile->formatOutput = true;
?>

Pour générer le fichier XML, il suffit d’utiliser la méthode save() avec pour paramètre le nom du fichier XML : 

<?php
    $xmlFile->save('bibliotheque.xml');
?>

le code complet est donc :

<?php
    $bd = new PDO("mysql:host=localhost;dbname=bibliotheque", "root", "");
    $r = $bd->query('SELECT * FROM livres');

    $xmlFile = new DOMDocument('1.0', 'utf-8');
    $xmlFile->appendChild($bibliotheque = $xmlFile->createElement('bibliotheque'));

    while($rs = $r->fetch(PDO::FETCH_ASSOC)){
        $bibliotheque->appendChild($livre = $xmlFile->createElement('livre'));
        $livre->appendChild($xmlFile->createElement('titre', $rs['titre']));
        $livre->appendChild($xmlFile->createElement('auteur', $rs['auteur']));
        $livre->appendChild($xmlFile->createElement('parution', $rs['parution']));
    }

    $xmlFile->formatOutput = true;
    $xmlFile->save('bibliotheque.xml');
?>

Et si nous voulons ajouter des attributs pour avoir par exemple ceci :

<?xml version="1.0" encoding="utf-8"?>
<bibliotheque>
  <livre note="mes livres personnels">
    <titre notation="favoris">The secret of love</titre>
    <auteur>Harold Klemp</auteur>
    <parution>1997</parution>
  </livre>
  <livre note="mes livres personnels">
    <titre notation="favoris">The Prophet</titre>
    <auteur>Gibran Khalil Gibran</auteur>
    <parution>1923</parution>
  </livre>
  <livre note="mes livres personnels">
    <titre notation="favoris">Stranger by the River</titre>
    <auteur>Paul Twitchell</auteur>
    <parution>1982</parution>
  </livre>
</bibliotheque>

Rien de plus simple, il suffira juste de mettre dans une variable le noeud auquel on veut ajouter l’attribut et d’utiliser la méthode setAttribute(nom_attribut, valeur_attribut) : 

<?php
    $bd = new PDO("mysql:host=localhost;dbname=bibliotheque", "root", "");
    $r = $bd->query('SELECT * FROM livres');

    $xmlFile = new DOMDocument('1.0', 'utf-8');
    $xmlFile->appendChild($bibliotheque = $xmlFile->createElement('bibliotheque'));

    while($rs = $r->fetch(PDO::FETCH_ASSOC)){
        $bibliotheque->appendChild($livre = $xmlFile->createElement('livre'));
        $livre->setAttribute('note', 'mes livres personnels');

        $livre->appendChild($titre = $xmlFile->createElement('titre', $rs['titre']));
        $titre->setAttribute('notation', 'favoris');

        $livre->appendChild($xmlFile->createElement('auteur', $rs['auteur']));
        $livre->appendChild($xmlFile->createElement('parution', $rs['parution']));
    }

    $xmlFile->formatOutput = true;
    $xmlFile->save('bibliotheque.xml');
?>

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *