Page 1 sur 1

Probleme pour creer un xml avec architecture complexe.

Posté : 06 avr. 2008, 02:28
par Ludo_bordeaux
Bonjour.
Je vous explique mon problème plus en détail.
J'ai une base de donnée sql du type :

id collection ligne theme produit

Le but est d'écrire un xml architecturé comme suis :

- collection
- ligne
-theme
-produit
-produit
-produit
-/theme
-theme
-produit
-produit
-produit
-/theme

etc ......

Et là .... je bloque.
Il me faudrait faire une boucle par collection, puis par theme etc ... et je sais pas comment.

Une idée quelqu'un ???

Merci d'avance.

Posté : 06 avr. 2008, 06:08
par Cyrano
Bien poser ton sujet faciliterait la chose :-k

Avant d'aller plus loin, question : est-ce que la sortie de ta requête produit bien quelque chose dans ce genre ?

Code : Tout sélectionner

+---------+----------+----------+---------+-----------+ | coll_id | ligne_id | theme_id | prod_id | prod_nom | +---------+----------+----------+---------+-----------+ | 1 | 1 | 1 | 1 | produit 1 | | 1 | 1 | 1 | 2 | produit 2 | | 1 | 1 | 1 | 3 | produit 3 | | 1 | 1 | 2 | 4 | produit 4 | | 1 | 1 | 2 | 5 | produit 5 | | 1 | 1 | 2 | 6 | produit 6 | | 1 | 2 | 3 | 7 | produit 7 | | 1 | 2 | 3 | 8 | produit 8 | | 1 | 2 | 3 | 9 | produit 9 | +---------+----------+----------+---------+-----------+
Et est-ce que ce que tu veux construire en XML ressemble à ceci ?

Code : Tout sélectionner

<collection> <ligne id="1"> <theme id="1"> <produit id="1">produit 1</produit> <produit id="2">produit 2</produit> <produit id="3">produit 3</produit> </theme> <theme id="2"> <produit id="4">produit 4</produit> <produit id="5">produit 5</produit> <produit id="6">produit 6</produit> </theme> </ligne> <ligne id="2"> <theme id="3"> <produit id="7">produit 7</produit> <produit id="8">produit 8</produit> <produit id="9">produit 9</produit> </theme> </ligne> </collection>
Si ce n'est pas ça, modifie selon ton point de départ et l'arrivée où tu veux te rendre. Là on pourra te montrer le chemin.

Posté : 06 avr. 2008, 14:39
par Ludo_bordeaux
Salut et merci de ta réponse.
J'avais mon même du mal à formuler e problème :)

Donc c'est bien comme dans ton exemple, mais avec plusieurs collections.
Ma requête trace bien quelque chose comme ce que tu me montres.

Le xml devra ressembler plutot à ça :

Code : Tout sélectionner

<produits> <collection id="1"> <ligne id="1"> <theme id="1"> <produit id="1">produit 1</produit> <produit id="2">produit 2</produit> <produit id="3">produit 3</produit> </theme> <theme id="2"> <produit id="4">produit 4</produit> <produit id="5">produit 5</produit> <produit id="6">produit 6</produit> </theme> </ligne> <ligne id="2"> <theme id="3"> <produit id="7">produit 7</produit> <produit id="8">produit 8</produit> <produit id="9">produit 9</produit> </theme> </ligne> </collection> <collection id="2"> <ligne id="1"> <theme id="1"> <produit id="1">produit 1</produit> <produit id="2">produit 2</produit> <produit id="3">produit 3</produit> </theme> <theme id="2"> <produit id="4">produit 4</produit> <produit id="5">produit 5</produit> <produit id="6">produit 6</produit> </theme> </ligne> <ligne id="2"> <theme id="3"> <produit id="7">produit 7</produit> <produit id="8">produit 8</produit> <produit id="9">produit 9</produit> </theme> </ligne> <collection> </produits>

Ca te parle plus ?

Posté : 06 avr. 2008, 20:18
par Cyrano
Ok, ça revient sensiblement au même pour le XML : il faut dans ce cas mettre des conditions imbriquées dans la boucle de traitement.
Voici un exemple basique, à toi ensuite d'adapter à ton propre modèle de données.

On va partir d'un simple tableau avec deux colonnes de données :

Code : Tout sélectionner

+--------+-----------+ | genre | prénom | +--------+-----------+ | garçon | Jean | | garçon | Jérôme | | garçon | Pierre | | garçon | Paul | | fille | Julie | | fille | Jeanne | | fille | Valérie | +--------+-----------+
En PHP, on va traduire ça comme ceci :
$prenoms = array(
    array("genre"=>"garçon", "prenom"=>"Jean"),
    array("genre"=>"garçon", "prenom"=>"Jérôme"),
    array("genre"=>"garçon", "prenom"=>"Pierre"),
    array("genre"=>"garçon", "prenom"=>"Paul"),
    array("genre"=>"fille", "prenom"=>"Julie"),
    array("genre"=>"fille", "prenom"=>"Jeanne"),
    array("genre"=>"fille", "prenom"=>"Valérie")
);
But de la manoeuvre, obtenir une arborescence XML de ce style :

Code : Tout sélectionner

<prenoms> <garcons> <prenom>Jean</prenom> <prenom>Jérôme</prenom> <prenom>Pierre</prenom> <prenom>Paul</prenom> </garcons> <filles> <prenom>Julie</prenom> <prenom>Jeanne</prenom> <prenom>Valérie</prenom> </filles> </prenoms>
On va utiliser une boucle pour parcourir notre tableau de la même manière que tu dois parcourir le retour de ta base de données. Ce que je montre ici, c'est la méthodologie qu'il te faudra utiliser.

À chaque tour de boucle, on va lire une ligne du tableau, mais on ne veut pas écrire "garçon" <a chaque tour, on ne le veux qu'au début de la liste des prénoms de garçon, le fermer ensuite et après, pareil pour les prénoms de filles.

Ça veut d'abord dire que le résultat du tableau doit impérativement être trié dans un ordre, donc dans ton cas, la requête SQL devra impérativement comporter une clause ORDER BY sur une ou plusieurs colonnes.
Ici, j'ai volontairement trié le tableau à la création, la partie qui nous intéresse arrive maintenant.
<?php
$prenoms = array(
    array("genre"=>"garçon", "prenom"=>"Jean"),
    array("genre"=>"garçon", "prenom"=>"Jérôme"),
    array("genre"=>"garçon", "prenom"=>"Pierre"),
    array("genre"=>"garçon", "prenom"=>"Paul"),
    array("genre"=>"fille", "prenom"=>"Julie"),
    array("genre"=>"fille", "prenom"=>"Jeanne"),
    array("genre"=>"fille", "prenom"=>"Valérie")
);
/* On ouvre le contenant de base du fichier XML */
$xml = '<prenoms>' . "\n";
$genre = ""; // Pointeur initialisé à "vide"
foreach($prenoms as $index => $tableau)
{
    // On vérifie si on a changé de genre
    if($tableau['genre'] != $genre)
    {
        if(!empty($genre))
        {
            $xml .= '    </'. $genre .'>' . "\n";
        }
        $xml .= '    <'. $tableau['genre'] .'>' . "\n";
        $genre = $tableau['genre'];
    }
    $xml .= '        <prenom>'. $tableau['prenom'] .'</prenom>' . "\n";
}
/**
 * le tour est fini, on ferme le dernier bloc du 
 * groupe "genre" puisqu'on a plus rebouclé sur une nouvelle valeur
 */
$xml .= '    </'. $genre .'>' . "\n";
/* On peut fermer le fichier XML */
$xml .= '</prenoms>';
echo $xml;
?>
Suis bien les commentaires du code, ils sont importants. Teste ce code, observe et adapte à ton besoin.