Page 1 sur 1

PHP4 : Recherche de créateur de structure XML hiérarchisée

Posté : 23 juin 2008, 18:46
par caroube
Bonjour,

Suite à une sélection dans une base de données, j'ai un tableau de valeurs indexé par 5 caractéristiques : nom de l'indicateur économique, région, secteur économique, pays, année.
Exemple :

Code : Tout sélectionner

[0] => Array('Export', 'PACA', 'Industrie', 'Chine', '2008', 23); [1] => Array('Import', 'PACA', 'Industrie', 'Chine', '2008', 12); [2] => Array('Import', 'PACA', 'Industrie', 'Chine', '2007', 53); [3] => Array('Import', 'PACA', 'Agroalimentaire', 'Allemagne', '2007', 12); ...
Je peux convertir ce tableau en XML simple s'il le faut.
Ce que je recherche, c'est un code qui me permettrait de créer un XML hiérarchique, en donnant les ordres de regroupement. Par exemple, si je lui indique qu'il faut regrouper par (indicateur, secteur, pays, année, territoire), j'aimerais obtenir quelque chose dans ce style

Code : Tout sélectionner

<data niveau='1' type='indicateur'> <nom>Export</nom> <data niveau='2' type='secteur'> <nom>Industrie</nom> <data niveau='3' type='pays'> <nom>'Chine'</nom> <data niveau='4' type='année"> <nom>2008</nom> <valeur>23</valeur> </data> </data> </data> </data> <data niveau='1' type='indicateur'> <nom>Import</nom> <data niveau='2' type='secteur'> <nom>Industrie</nom> <data niveau='3' type='pays'> <nom>'Chine'</nom> <data niveau='4' type='année"> <nom>2008</nom> <valeur>12</valeur> </data> <data niveau='4' type='année"> <nom>2007</nom> <valeur>53</valeur> </data> </data> </data> <data niveau='2' type='secteur'> <nom>Agroalimentaire</nom> <data niveau='3' type='pays'> <nom>'Allemagne'</nom> <data niveau='4' type='année"> <nom>2007</nom> <valeur>12</valeur> </data> </data> </data> </data>
Partant du principe qu'il ne faut pas réinventer la poudre quand elle existe et partant également du fait qu'il y a des centaines d'autres trucs à faire dans l'application, est-ce que quelqu'un connaît une bibliothèque de fonction qui permettrait de générer ? Ou un exemple d'un tutorial qui s'en rapprocherait ? Le tout sous PHP 4.

Merci

Posté : 23 juin 2008, 20:11
par sadeq
Voici par exemple, un programme générique qui permet de lire un arbre XML en PHP.
<?php
// On charge le fichier xml en mémoire
$xml = simplexml_load_file("data1.xml");

// Pour tester, on affiche l'arborescence objet du document XML
echo "<h3>Affichage de la structure objet du document XML</h3><pre>"; 
print_r($xml); 
echo "</pre>";

// Pour personnaliser la lecture de l'arbre xml on utilise une fonction lireArbreXML décrite en bas
echo "<h3>Affichage personnalisé du contenu du document XML</h3>";
lireAfficherArbreXML($xml);

//Fonction de lecture de l'arbre XML
function lireAfficherArbreXML($xmlDoc) {

	// Parcourir les éléments XML <element></element>
	foreach($xmlDoc as $nom=>$element) {
			// on affiche le nom de l'élément
			echo "Elément <b>".$nom."</b><ul>";
			// on récupére les attributs s'ils sont présents
			$attributs = $element->attributes();
			if(trim($attributs)!="") {
				echo "Ses attributs sont : <ul>";
				// Parcourir les attributs 
				foreach($attributs as $nom=>$valeur) {
					echo "<li><b>".$nom."</b> = <i>".$valeur."</i></li>";
				}
				echo "</ul>";
			}
			// L'élément contient soit une valeur unique, soit d'autres éléments enfants :
			if(trim($element) != "") {
				//L'élément contient une valeur unique
				echo "Sa valeur est <i>".$element."</i>";
			} 
			else {
				// sinon l'élément contients des éléments enfants qu'il faut récupérer
				$enfants = $element->children();
				// On réutilise pour ça la même fonction (récursivité)
				lireAfficherArbreXML($enfants);
			}
			echo "</ul>";
	}
}
?>
Et voici une autre proposition de schéma XML possible :

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?> <data> <indicateur nom="Export"> <secteur nom="Industrie"> <pays nom="Chine"> <annee nom="2008"> <valeur>23</valeur> </annee> </pays> </secteur> </indicateur> <indicateur nom="Import"> <secteur nom="Industrie"> <pays nom="Chine"> <annee nom="2008"> <valeur>12</valeur> </annee> <annee nom="2007"> <valeur>53</valeur> </annee> </pays> </secteur> <secteur nom="Agroalimentaire"> <pays nom="Allemagne"> <annee nom="2007"> <valeur>12</valeur> </annee> </pays> </secteur> </indicateur> </data>

Posté : 23 juin 2008, 23:41
par caroube
Merci pour la réponse, mais ce n'est pas tellement ce que j'attendais.
Je cherche un bout de code plutôt pour créer l'arbre XML à partir d'un tableau plat, pas pour lire le XML (enfin du moins pas encore).

Pour la proposition d'arbre XML que tu fais, je ne suis pas très chaud. En effet, j'envisage de permettre à l'utilisateur de faire les regroupements qu'il veut ; celui que j'avais donné n'était qu'un exemple. Ainsi l'utilisateur doit pouvoir regrouper par (secteur, indicateur, pays, année, territoire) ou (année, territoire, indicateur, secteur, pays). C'est pour ça que je voudrais banaliser les différents niveaux de mon arbre hiérarchique afin de n'avoir pas à gérer le cas où le tag <secteur> est tout en haut ou au milieu.

Mais merci quand même pour la réponse

Posté : 24 juin 2008, 01:19
par sadeq
Ok, c'est possible d'écrire du code XML en utilisant la classe XMLWriter sous PHP.

Supposons que tu veux créer un document simplifié comme le suivant :

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?> <doc> <data niveau="1" type="indicateur"> <nom>Export</nom> </data> </doc>
Voici la démarche en PHP:
<?php
    // Créer un objet xmlWriter qui écrit des balises xHTML
    $xml = new xmlWriter();

    // Créer un nouveau document dans la mémoire
    $xml->openMemory();
   
    // Commencer par la signature xml (version et encodage)
    $xml->startDocument('1.0','UTF-8');

    // Créer le premier nœud racine <doc>
    $xml->startElement ('doc');
    
    // Créer le premier élément <data>
    $xml->startElement ('data');
	
     // Ecrire les attributs de cet élément (niveau et type)
    $xml->writeAttribute( 'niveau', '1');
    $xml->writeAttribute( 'type', 'indicateur');
    
    // Ecrire un élément complet porteur de valeur <element>valeur</element>
    $xml->writeElement('nom', 'Export'); 
    
    // Fermer l'élément <data> déjà ouvert  par un </data>
    $xml->endElement(); 
    
    // Fermer la racine <doc> par un </doc>
    $xml->endElement(); 
   
    // Afficher ce qui est écrit dans la mémoire
    print $xml->outputMemory(true);   
?>
Maintenant, puisque toi, tu as les données dans un tableau, tu le parcours en déployant ces fonctions xmlWriter.

Posté : 25 juin 2008, 08:43
par caroube
Encore une fois merci d'avoir pris le temps de répondre
Mais ce n'est toujours pas ce que je recherche.
Je sais écrire un XML simple.
Ma question concerne spécifiquement un passage d'un tableau simple à un XML hiérarchisé.
S'il le faut vraiment, j'écrirais le code nécessaire, mais ce que je recherchais c'est un code "tout fait" ou un embryon suffisamment développé que j'aurais adapté. C'était juste pour gagner du temps car j'ai des milliers d'autres choses à faire sur ce projet.

Cela dit, si personne ne connaît ce genre de code, ce n'est pas grave.

Posté : 25 juin 2008, 08:58
par Shrell
Hello
Je te dirais de commencer par un array_multisort() sur ton tableau pour le ranger dans l'ordre voulu par l'utilisateur, ensuite tu boucles sur ton tableau. A chaque itération, tu compares la valeur courante avec la valeur précédente, si c'est la même tu groupes, sinon tu crées une nouvelle entrée.
Je ne sais pas si je suis très clair :?