Designed by Gaetan !
44 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 !

 Lire  03/04/2008 de 5prpali
Exercice très intéressant mais est-ce bien utile ? Un...
 Lire  08/03/2008 de manour
je cherche le code sources php pour inserer donnees x...
  v1.3p © ASP-PHP.net 2002  

Llenne le 13/10/2003 (30 352 hits)
Didier Ils l’ont fait avec SQL Server. Découvrez comment !
Concours de programmation Flash !
Au fil des news  
ASP - Redimensionner Image + Picto après Upload - Galerie photos, revue de presse, ...
But : Proposer aux visiteurs de charger des images sans se soucier du "poids" de l'image, puisqu'on ...
Exporter et Importer un site SharePoint - Comment déplacer un site SharePoint
Une question est très régulièrement posée à tout responsable de ferme SharePoint : Comment ...
Bon anniversaire - Comment le souhaiter à ses membres ?
Avoir un site, c'est bien. Avoir des inscrits, c'est mieux. Souhaiter leur anniversaire, c'est ...
Audio & Vidéo - Multimédia dans ses pages web
AUDIO/VIDEO : QuickTime, MediaPlayer, RealPlayer, FlashPlayer, ... : Du multimédia dans ses pages ...
Magazines - Le Hors-Série .Net de Programmez !
PHP - Administrer en ligne - Protection des pages
Protéger ses pages pour administrer son site en ligne en (relative) sécurité (PHP).
Communautés - Concours de programmation Flash !
[MAJ] Afficher ses images à la taille voulue - Utilisation du composant IMGSIZE
Ajout de la vérification de l'existence du fichier et d'un test d'erreur de retour du composant ...
Protéger ses Images - Propriété intellectuelle - Vie privée
Je me suis penché sur la question en tant qu'artiste moi-même, et concepteur de site web pour ...
Création de miniatures - Fonction php de création
Cette fonction sert à créer des miniatures.
ASP - ADMINISTRER en ligne - Protection des pages
Protéger ses pages pour administrer son site en ligne en (relative) sécurité (ASP).
JavaScript - Numéros de ligne à gauche d'un textarea
Protection - Sécurité - Mise au point - Précautions - Solutions
Même sans être paranoïaque, on a tous entendu parler de failles de sécurité, piratage informatique, ...
AspSmartUpload - Mode d'Emploi
Le composant ASPSmartUpload (gratuit) permet de gérer les téléchargements de FICHIERS ou de ...
JavaScript - Contrôler une date saisie dans un formulaire
HTML - Ajouter un fichier multimédia dans une page web
HTML - Musique de Fond sur son site
Afficher ses images à la taille voulue - Utilisation du composant IMGSIZE
Devant la diversité des formats d'image actuels, il est parfois nécessaire de connaître les ...
CSS - Icône Personnalisée sur son site
JavaScript - Interdire Clic Droit et message d'alerte
CSS - Curseur Personnalisé sur son site
JavaScript - Fenêtre à la Dimension de l'Ecran
La gouvernance SharePoint - Partie 1 - Première partie sur la gouvernance dans Sharepoint
Un projet de mise en place de ferme SharePoint est un projet important pour toute structure ...
ASP - Redimensionner Image + Picto après Upload
ASP - Administration en ligne : Protection des Pages
PHP - Administration en ligne : Protection des Pages
PHP - Redimensionner Image + Picto après Upload
ASP - Boutons ON OFF pour tout type de musique
PHP - Boutons ON OFF pour tout type de musique
SharePoint et OpenSearch - Utiliser l'option OpenSearch avec SharePoint
Nous avons maintenant un site SharePoint fonctionnel associé à un moteur de recherche efficace. Il ...
Magazines - Le n°109 de Programmez est disponible
SharePoint et PowerShell - Utilisation de PowerShell pour un script d'admin
PowerShell est le nouveau moteur de script de Microsoft. Il permet tout comme VBScript de créer des ...
[MAJ] [PHP] - Validation de formulaire - Gestion des erreurs via style CSS
Ajout de la sécurité anti sql injection de premier niveau.
Adobe - Adobe propose 3 nouvelles versions bêta publiques
VBScript - Interroger un serveur MYSQL
Divers - Web developpement
PHP5 - Copie de fichiers distants
Les stratégies de Backup dans WSS V3 - Quelles sont les différentes solutions de BackUp
Nous avons vu au travers des précédents articles différents sujets pour Windows SharePoint Services ...
Création d'une solution de déploiement SharePoint - Créer la solution pour notre composant SharePoint
Après avoir suivi toutes les étapes pour la création de notre composant (Feature) SharePoint, il ...
Magazines - Le n°108 de Programmez est disponible
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
v3 © Didier 2003   
 

Corpo Sciences de Reims Partitions gratuites Carte, météo, annonces
 El Roubio Codes Sources TechNet CodePPC Groupes Utilisateurs Microsoft The Inquirer FR MVP Wygwam DotNet Project ASP-magazine