©
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 commentaireici.
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/php/ .
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.
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
|