Designed by Maunakea !
89 en ligne   Boutique | Sites | Bar | Forum | PhpBB | Actu | Glossaire | Codes | Tips | Liens | Livres | Lettre  


 Recherche

 NewsLetter






   

GenXML : export de base de données

Génère un document XML à partir d'une base





Llenne
GenXML est une Class qui permet, à l'aide d'un fichier de description, d'exporter des données d'une base de données vers un document XML. Facile à utiliser.


LENNE.GenXML
==============================================================
Génère un document XML
à partir d'une base de données.



© Copyright Ludovic Lenne - 2003

L'objet : LENNE.GenXML

Voyons comment exporter des données vers un fichier XML, avec GenXML.
Nous utiliserons pour ce tutoriel, une base Access ( MyDb.mdb ) ainsi que la Class GenXML. Cette base est constituées de cinq tables (auteurs, editeurs, ventes, titres, titre_auteur).

1 - Dans un premier temps nous allons exporter les titres parus chez les différents éditeurs. Le fichier XML prendra cette forme :

<catalogue>
   <editeur name="nom">
      <livres>
         <titre>titre</titre>
         ...
      </livres>
   </editeur>
</catalogue>

Créons un fichier que nous allons nommer editeur_titres.gen. Pour connaître la syntaxe du fichier Gen, cliquez ici. Les commentaires qui apparaissent ci-dessous ne doivent pas être dans le fichier finale.

// Définition de l'encodage du document XML.
[Encoding=iso-8859-1/]
// Définition de la version du document XML.
[Version=1.0/]
// Cette balise identifie le début de la description du document XML à créer.
[Gen]
  
 // Racine du document XML
   <catalogue>
      
// Cette balise indique que nous allons créer des enfants pour <catalogue>.
      [ChildNodes]
         
// Cette balise indique la chaine de connexion à la base de données.
         // Nous utiliserons toujours la même.
         // Nous définirons la chaine de connexion plus tard dans le fichier php.
         // Nous ferons donc ici appelle à la connexion par défaut.
         [Connection/]
        
 // Cette balise nous permet de spécifier la requête que nous allons faire dans la base de données.
         // Nous allons récupérer les noms de différents éditeurs, et leur identifiants.
         // Les identifiants sont ici nécessaires pour assurer la patérnité avec ses enfants.
         [Source]SELECT editeurs.pub_name, editeurs.pub_id FROM editeurs[/Source]
         
// Nous n'avons ici aucun filtre à effectuer sur les données récupérées.
         [Where/]
         
// Définissons maintenant les enfants de catalogue.
         // Cette balise définie le début de la desctiption des enfants de <catalogue>.
         [Nodes]
            
// Nous decrivons l'enfant editeur de catalogue avec comme attribut son nom.
            // [Value[pub_name]] indique où doit être insérer le nom de l'éditeur.
            <editeur name="[Value[pub_name]]">
               <livres>
                  
// Indiquons maintenant les enfants de <editeur><livres>.
                  [ChildNodes]
                     [Connection/]
                     
// Nous récupérons les titres des livres et les identifiants des éditeurs de ces livres.
                     // Les identifiants sont ici nécessaires pour assurer la descendance avec les parents éditeurs.
                     [Source]SELECT titres.title, titres.pub_id FROM titres[/Source]
                     
// Nous allons à l'aide du filtre sélectionner les titres pour chaque éditeur.
                     [Where]pub_id = '[Value[pub_id]]' [/Where]
                     
// Définissons maintenant les enfants de <editeur>.
                     // Cette balise défini le début de la desctiption des enfants de <editeur><livres>.
                     [Nodes]
                       
 // [Value[title]] indique où doit être insérer les titres des livres de l'éditeur.
                        // [Value[title]] est égal à la valeur du champ [title].
                        <titre>[Value[title]]</titre>
                     
// Fermons la description des titres
                     [/Nodes]
                  
// Fermons la liste des titres
                  [/ChildNodes]
               </livres>
            </editeur>
         
// Fermons la description des editeurs
         [/Nodes]
      
// Fermons la liste des editeurs
      [/ChildNodes]
   </catalogue>
// Fermons la description du document XML
[/Gen]

Vous pouvez voir le fichier sans les commentaire ici.

Dans la construction du fichier Gen, vous aurez constaté que les relations sont traitées en dehors de la requête. C'est à dire sans INNER JOIN, qui est remplacé par [Where], qui définit ainsi la relation de hiérachie entre noeuds enfants et parents.

Attaquons nous à la création de la page php pour mettre en route l'export des données. Copier la Class LENNE.GenXML dans un dossier nommé "class" à la racine de votre site.
En voici la syntaxe :

<?
// Ajout de la Class à la page
include($_SERVER["APPL_PHYSICAL_PATH"]."class\\LENNE.GenXML.php");
?><?
// Création de la Class
$objGenXML = new GenXML;
// Mise dans la propriété Connexion la chaine de connection à la base de données.
// C'est ici que nous définissons la chaine de connection par défaut.
$Connexion = "Driver= {Microsoft AccessDriver(*.mdb)};Dbq=c:\somepath\mydb.mdb;Uid=admin;Pwd=;";
$objGenXML->put_Connection($Connexion);
// Chargement du fichier que nous venons de créer (indiquer son emplacement sur le serveur physique) : editeur_titres.gen
// Il est ici placé dans le dossier gen à la racine du site.
$objGenXML->LoadGen($_SERVER["APPL_PHYSICAL_PATH"]."gen\\editeur_titres.gen");
// Récupération du document XML généré.
$stringXML = $objGenXML->get_XML( );
echo $stringXML;
?>

Vous pouvez observer le résultat affiché ici.

Voilà c'est tout ;-) Vous conviendrez que le plus difficile étant de créer le fichier Gen de description du document XML à créer.
N'oubliez pas que les charactères spéciaux du document XML sont encodés en html.


2 - Dans un deuxième temps nous allons voir comment GenXML gère les enfants multiples, Nous allons exporter les titres parus chez les différents éditeurs ainsi que les auteurs qui travaillent pour chaque éditeur. Le fichier XML prendra cette forme :

<catalogue>
   <editeur nom="nom">
      <livres>
         <titre>titre</titre>
         ...
      </livres>
      <auteurs>
            <auteur prenom="prenom" nom="nom"/>
            ...
      </auteurs>
 </editeur>
</catalogue>

Créons un fichier que nous allons nommer editeur_titres_auteurs.gen. Pour connaître la syntaxe du fichier Gen, cliquez ici.

[Encoding=iso-8859-1/]
[Version=1.0/]
[Gen]
   <catalogue>
      [ChildNodes]
         [Connection/]
         // Nous récupérons les noms de différents éditeurs, et leurs identifiants.
         // Les identifiants sont ici nécessaires pour assurer la patérnité avec ses enfants.
         [Source]SELECT editeurs.pub_name, editeurs.pub_id FROM editeurs[/Source]
         [Where/]
         [Nodes]
            <editeur name="[Value[pub_name]]">
               <livres>
                  [ChildNodes]
                     [Connection/]
                     // Nous récupérons les titres des livres et les identifiants des editeurs de ces livres.
                     // Les identifiants sont ici nécessaires pour assurer la descendance avec les parents <editeur>.
                     [Source]SELECT titres.title, titres.pub_id FROM titres[/Source]
                     [Where]pub_id = '[Value[pub_id]]' [/Where]
                     [Nodes]
                        <titre>[Value[title]]</titre>
                     [/Nodes]
                  [/ChildNodes]
               </livres>
               <auteurs>
                  [ChildNodes]
                     [Connection/]
                     // Nous récupérons les auteurs des livres et les identifiants des editeurs des livres.
                     // Les identifiants sont ici nécessaires pour assurer la descendance avec les parents <editeur>.
                     [Source]
                                  SELECT auteurs.au_fname, auteurs.au_lname, editeurs.pub_id
                                  FROM (auteurs INNER JOIN titre_auteur ON auteurs.au_id = titre_auteur.au_id) INNER JOIN (editeurs
                                  INNER JOIN titres ON editeurs.pub_id = titres.pub_id) ON titre_auteur.title_id = titres.title_id
                                  GROUP BY auteurs.au_fname, auteurs.au_lname, editeurs.pub_id
                     [/Source]
                     // Nous allons à l'aide du filtre sélectionner les auteurs pour chaque éditeur.
                     [Where]pub_id = '[Value[pub_id]]' [/Where]
                     [Nodes]
                        <auteur prenom="[Value[au_fname]]" nom="[Value[au_lname]]"/>
                     [/Nodes]
                  [/ChildNodes]
               </auteurs>
            </editeur>
         [/Nodes]
      [/ChildNodes]
   </catalogue>
[/Gen]

Vous pouvez voir le fichier sans commentaire ici.

Finalement, rien de bien surprenant...
La page php, pour mettre en route l'export des données, est identique à la précédente à l'exception du nom du fichier Gen.

<?
// Ajout de la Class à la page
include($_SERVER["APPL_PHYSICAL_PATH"]."class\\LENNE.GenXML.php");
?><?
// Création de la Class
$objGenXML = new GenXML;
// Mise dans la propriété Connexion la chaine de connection à la base de données.
// C'est ici que nous définissons la chaine de connection par défaut.
$Connexion = "Driver= {Microsoft AccessDriver(*.mdb)};Dbq=c:\somepath\mydb.mdb;Uid=admin;Pwd=;";
$objGenXML->put_Connection($Connexion);
// Chargement du fichier que nous venons de créer (indiquer son emplacement sur le serveur physique) : editeur_titres_auteurs.gen
// Il est ici placé dans le dossier gen à la racine du site.
$objGenXML->LoadGen($_SERVER["APPL_PHYSICAL_PATH"]."gen\\editeur_titres_auteurs.gen");
// Récupération du document XML généré.
$stringXML = $objGenXML->get_XML( );
echo $stringXML;
?>

Vous pouvez observer le résultat affiché ici.

N'oubliez pas que les charactères spéciaux du document XML sont encodés en html.


3 - Dans un troisième et dernier temps, nous allons voir comment GenXML gère les petits enfants, Nous allons exporter les titres parus chez les différents éditeurs, et pour chaque titre quels en sont les auteurs, et quelles quantités on été vendues, à quelle date.
Le fichier XML prendra une forme plus évoluée, n'hesitez pas à bien le visualiser pour le comprendre :

<catalogue>
   <editeur nom="nom">
      <livres>
         <livre titre="titre">
            <auteurs>
               <auteur prenom="prenom" nom="nom"/>
            </auteurs>
            <ventes>
               <vente date="date">
                  <quantite>quantite</quantite>
               </vente>
            </ventes>
         </livre>
         ...
      </livres>
  </editeur>
</catalogue>

Créons un fichier que nous allons nommer editeur_livres_auteurs.gen. Pour connaître la syntaxe du fichier Gen, cliquez ici.

[Encoding=iso-8859-1/]
[Version=1.0/]
[Gen]
   <catalogue>
      [ChildNodes]
         [Connection/]
         // Nous récupérons les noms de différents éditeurs, et leurs identifiants.
         // Les identifiants sont ici nécessaires pour assurer la patérnité avec ses enfants.
         [Source]SELECT editeurs.pub_name, editeurs.pub_id FROM editeurs[/Source]
         [Where/]
         [Nodes]
            <editeur name="[Value[pub_name]]">
               <livres>
                  [ChildNodes]
                     [Connection/]
                     // Nous récupérons les titres des livres et les identifiants des éditeurs de ces livres,
                     // Les identifiants des éditeurs sont ici nécessaires pour assurer la descendance avec les parents <editeur>.
                     // De plus nous récupérons les identifiants des livres pour assurer la patérnité des enfants.
                    [Source]SELECT titres.title, titres.title_id,titres.pub_id FROM titres[/Source]
                     
// Nous allons à l'aide du filtre sélectionner les livres pour chaque éditeur.
                     [Where]pub_id = '[Value[pub_id]]' [/Where]
                     [Nodes]
                        <livre titre="[Value[title]]">
                           <auteurs>
                              [ChildNodes]
                                 [Connection/]
                                 // Nous récupérons les auteurs des livres et les identifiants des livres.
                                 // Les identifiants sont ici nécessaires pour assurer la descendance avec les parents <livre>.
                                 [Source]
                                     SELECT titre_auteur.title_id, auteurs.au_fname, auteurs.au_lname
                                     FROM auteurs INNER JOIN titre_auteur ON auteurs.au_id = titre_auteur.au_id
                                 [/Source]
                     
            // Nous allons à l'aide du filtre sélectionner les auteurs pour chaque livre.
                                 [Where]title_id = '[Value[title_id]]' [/Where]
                                 [Nodes]
                                    <auteur prenom="[Value[au_fname]]" nom="[Value[au_lname]]"/>
                                 [/Nodes]
                              [/ChildNodes]
                           <auteurs>
                           <ventes>
                              [ChildNodes]
                                 [Connection/]
                                 // Nous récupérons les ventes des livres, avec dates et quantité, classées par date.
                                 // Les identifiants sont ici nécessaires pour assurer la descendance avec les parents <livre>.
                                 [Source]
                                     SELECT ventes.title_id, ventes.ord_date, ventes.qty
                                     FROM ventes
                                     ORDER BY ventes.ord_date ASC
                                 [/Source]
                     
            // Nous allons à l'aide du filtre sélectionner les ventes pour chaque livre.
                                 [Where]title_id = '[Value[title_id]]' [/Where]
                                 [Nodes]
                                    
// Les dates demandent une petite précision : elles sont récupérées et converties
                                    // au format (jour/mois/année. résultat : 27/05/2001).
                                    // Pour obtenir un autre format consulter les commentaires de la page php ci-dessous
                                    <vente date="[Value[ord_date]]">
                                       <quantite>[Value[qty]]</quantite>
                                    </vente>
                                 [/Nodes]
                              [/ChildNodes]
                           </ventes>
                        </livre>
                     [/Nodes]
                  [/ChildNodes]
               </livres>
            </editeur>
         [/Nodes]
      [/ChildNodes]
   </catalogue>
[/Gen]

Vous pouvez voir le fichier sans commentaire ici.

Et bien, la description peut paraître plus compliquée. N'oubliez pas qu'il suffit de récupérer ce qui identifie la paternité et la descendance des noeuds (ex : les identifiants qui permettent la relation dans la base de données).
La page php, pour mettre en route l'export des données, est identique à la précédente, à l'exception de la définition du format des dates et du nom du fichier Gen.

<?
// Ajout de la Class à la page
include($_SERVER["APPL_PHYSICAL_PATH"]."class\\LENNE.GenXML");
?><?
// Création de la Class
$objGenXML = new GenXML;
// Définition du format de date en accord avec la fonction date( ) de php.
// Par défaut, la valeur retournée est sous la forme : d/m/Y. résultat : 27/05/2001
$objGenXML->put_Time("F j, Y"); // résultat : March 12, 2001. Cool non ;-)
// Mise dans la propriété Connexion la chaine de connection à la base de données.
// C'est ici que nous définissons la chaine de connection par défaut.
$Connexion = "Driver= {Microsoft AccessDriver(*.mdb)};Dbq=c:\somepath\mydb.mdb;Uid=admin;Pwd=;";
$objGenXML->put_Connection($Connexion);
// Chargement du fichier que nous venons de créer (indiquer son emplacement sur le serveur physique) : editeur_livres_auteurs.gen
// Il est ici placé dans le dossier gen à la racine du site.
$objGenXML->LoadGen($_SERVER["APPL_PHYSICAL_PATH"]."gen\\editeur_livres_auteurs.gen");
// Récupération du document XML généré.
$stringXML = $objGenXML->get_XML( );
echo $stringXML;
?>

Vous pouvez observer le résultat affiché ici.

C'est fini. ;-)
Alors, si vous n'avez pas tout compris ou si vous voulez plus d'info, n'hésitez pas à consulter le site http://genxml.lenne.org/ .
Si vous avez adoré, si une question vous vient à l'esprit, contactez moi à l'adresse : ludovic@lenne.org

Je tenais à remercier tous ceux qui m'ont motivés pour mettre au point GenXML. Je les remercie aussi de leur patience.

Pour cette Class 830 lignes de codes ont été nécessaires, commentaires compris. D'où cette conclusion.

Règle n°1 : Une ligne de code, une ligne de commentaire.
Règle n°2 : La conception doit représenter au moins 50 % du développement.

Si une personne bien intentionnée est intéressée pour convertir la Class en ASP, j'accepterais avec grand plaisir (j'avoue ne pas avoir le courage de m'atteler à cette tâche rapidement).

© Copyright Ludovic Lenne - 2003

 

Ludovic Lenne ;)

Pour pouvoir écrire dans ce forum, identifiez-vous !

  v1.3p © ASP-PHP.net 2002  

Llenne le 13/10/2003 (36 281 hits)
Didier Téléchargez gratuitement et légalement des logiciels Microsoft ! Si, si ;)
  • Visual Studio 2010
  • Office 2010
  • Expression Studio 3
  • SQL Server 2008
  • et d'autres...
Au fil des news  
Magazines - Le N°128 de Programmez est disponible
Magazines - Le N°127 de Programmez est disponible
Dreamweaver CS4 + Php + Mysql - Trucs et Astuces - Part 6
Pour continuer dans le même style, je vous propose une suite au précédent article. Rechercher tous ...
Adobe - Adobe Photoshop.com Mobile pour iPhone 1.1
JavaScript - Ajouter une page dans vos favorites
Dreamweaver CS4 + Php + Mysql - Trucs et Astuces - Part 5 -
Je vous propose cette fois deux astuces. Comment exporter une feuille de style avec l'aide de ...
SharePoint Personalization Site Links - Les liens personnalisés des MySite SharePoint
Nous avons vu dans les articles précédents comment agrémenter les pages de recherche afin de ...
Magazines - Le n°126 de Programmez est disponible
Outils - Traducteur en ligne automatique pour site web
Adobe - Adobe Photoshop.com Mobile pour Iphone
Magazines - Le n°125 de Programmez est disponible
Adobe - Adobe AIR 2 et Flash Player 10.1version bêta
Les conférences autour des technologies Microsoft - Liste non exhaustive des grands évènements
Nous allons essayer de regrouper un grand nombre des évènements autour des technologies Microsoft ...
Magazines - Le n°124 de Programmez est disponible
PHP - Forum PHP 2009
Composants - eFace - XAML en Java
WPF - Désactiver le bouton de réduction d'une fenêtre
Magazines - Le n°123 de Programmez est disponible
Magazines - Le n°122 de Programmez est disponible
Auditer une ferme SharePoint - Assurer le bon fonctionnement de SharePoint
Dans le cadre de la bonne gestion de son environnement SharePoint, il est utile de faire un ...
SQL Server 2008 Report Builder 2.0 - Installation et utilisation de Report Builder 2.0
Dans le cadre de la création de rapports pour SQL Server Reporting Services 2008, un outil est ...
Magazines - Le HS N° 1 de Web Design est disponible
Adobe - Adobe propose en Open Source les frameworks.....
Outils - EntityBuilder
CSharp - Sérialisation XML de vos objets
Magazines - Le n°121 de Programmez est disponible
Adobe - Adobe annonce MAX 2009 !
Outils - WhoIs
[MAJ] Dreamweaver MX + Php + MySql - Les formulaires - partie 3
Mise à jour du code, par DB 77, affichage du code erreur, dans la page erreur.php, traduction des ...
PHP - News avec photo - Système de gestion - affichage
Gestion - Administration - Affichage d'une "News", "Actualité", "Info", ... avec : - mise en forme ...
Outils - Crypt
Dreamweaver Php Mysql - Région répétée imbriquée
Je rebondis, sur un post du forum, pour vous montrer comment obtenir grâce à l'extension Simulated ...
Magazines - Le n° 120 de Programmez est disponible
Gérer les bases de contenu SharePoint - Gérer la croissance du volume des données
Dans le cadre de la gestion quotidienne de ferme SharePoint, il existe une partie qu'il faut ...
PHP - Le Coach PHP sur Visual Studio
.NET - Ecrire une application .NET utilisant MySQL
PHP - Utilisation de PHP dans le monde Microsoft
Magazines - Le n° 119 de Programmez est disponible
Adobe - Adobe annonce Photoshop Marketplace
[MAJ] Tutoriel AJAX simple - En avant vers le WEB2.0
Mis à jour le 20/04/2009
Tutorial : HTML | Scripting | ASP-PHP | ASP.net | SQL Server | XML
Sharepoint | XAML | Pocket | Dreamweaver | VML | Divers
  Scripts : Scripting | ASP-PHP | ASP.net | Divers
  Boutique | Annuaire | Bannières | Météo | Tribune | Partenariats
v3b © Didier 2003   
 

Corpo Sciences de Reims Partitions gratuites Carte, météo, annonces
 ASP-magazine Groupes Utilisateurs Microsoft TechNet MVP DotNet Project