Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > DOM
DOM Forum d'entraide pour l'extension DOM permettant de manipuler des documents XML en PHP 5 (approche DOM). Avant de poster -> tutoriels DOM
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/09/2011, 12h47   #1
Membre du Club
 
Homme
Étudiant
Inscription : septembre 2011
Messages : 75
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2011
Messages : 75
Points : 42
Points : 42
Par défaut Difficulté pour parcourir les fils

Bonjour, je requiert à nouveau votre aide car je rencontre un petit problème.

Toujours dans mon système de carte de france, je souhaite afficher pour chaque département, et pour chaque région, le nombre total de membres.

Les informations sur le département, les régions, et le nombre total de membre (par département et par région) sont stockés dans un fichier XML.


Dans un premier temps, je m'occupe des départements : grâce à DOM, je liste tout les départements existant et je les parcours un par un. Je compare l'attribut total du département (dans le fichier XML) à une requête SQL count(*) sur la BDD. Si le nombre est différent, je met à jour la valeur de l'attribut total dans le fichier XML...
Cette partie fonctionne très bien, c'est ensuite que ça se corse.


Je voudrais, pour chaque région, récupérer la valeur de l'attribut total des départements appartenant à la région pour ensuite ajouter ses totaux. Cela me permettrait de déterminer le total de membre de chaque région, simplement en additionnant le total de membres de chaque département qui la compose.


J'ai tenté plusieurs solutions (avec le DOM et du foreach comme ci-dessous), avec et sans parler de fils, avec XPath... mais je n'ai pas réussi à faire fonctionner cette partie du calcul.

Je sollicite donc votre aide pour essayer de trouver une solution plus propre, et surtout, fonctionnel ^^

Code pour calculer le total de membres par région :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
	$liste_region = $dom->getElementsByTagName("region");  // On liste toutes les régions
 
	foreach($liste_region as $region)
	{
		$total_region = 0;
 
		$region_dep = $region->firstChild; // Premier fils (premier département)
 
 
		while ($region_dep =! $region->lastChild)
		{
			$total_region = $total_region + $region_dep->getAttribute("total");
			$region_dep = $region_dep->nextSibling;
		}
 
 
		$total_region = $total_region + $region_dep->getAttribute("total"); // Pour le dernier fils (département)
 
		$region_nom = $region->getAttribute("nom_simple"); // On récupère le nom simple (sans nombre de membre)
		$region->setAttribute("total", $total_region); // Mis à jour du total région dans le XML
 
 
		if ($total_region == 0) {
			$texte = $region_nom . utf8_encode(" (aucun membre)");
		} elseif ($total_region == 1) {
			$texte = $region_nom . utf8_encode(" (1 membre)");
		} elseif ($total_region > 1) {
			$texte = $region_nom . utf8_encode(" (" . $total_region . " membres)");
		}
 
		$region->setAttribute("name", $texte); // Mis à jour de l'infobulle
	}


Code extrait de mon fichier XML :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<departements>
		<region name="Bretagne" enable="true" href="#" zoomable="true">
			<dep num="29" href="liste.php?dep=29" nom="Finistère" total="0">Finistère (aucun membre)</dep>
			<dep num="22" href="liste.php?dep=22" nom="Côtes-d'Armor" total="0">Côtes-d'Armor (aucun membre)</dep>
			<dep num="56" href="liste.php?dep=56" nom="Morbihan" total="0">Morbihan (aucun membre)</dep>
			<dep num="35" href="liste.php?dep=35" nom="Ille-et-Vilaine" total="0">Ille-et-Vilaine (aucun membre)</dep>
		</region>
		<region name="Basse Normandie" enable="true" src="#" zoomable="true">
			<dep num="50" href="liste.php?dep=50" nom="Manche" total="0">Manche (aucun membre)</dep>
			<dep num="14" href="liste.php?dep=14" nom="Calvados" total="0">Calvados (aucun membre)</dep>
			<dep num="61" href="liste.php?dep=61" nom="Orne" total="0">Orne (aucun membre)</dep>
		</region>
</departements>




Si ça peut servir (et au cas où il y est une erreur à corriger, ou une solution plus simple), voici aussi le bout de code, qui fonctionne, pour calculer le nombre de membre par département. Il s'exécute juste avant le calcul pour les régions.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
	$dom = new DomDocument();
	$dom->load('datas.xml');
 
	// DEPARTEMENTS
	$liste_dep = $dom->getElementsByTagName("dep");  // On liste tout les départements
 
 
	foreach($liste_dep as $dep)
	{	
		$dep_num = $dep->getAttribute("num");
		$total_xml = $dep->getAttribute("total");	
 
 
		// Compte le nombre de membres du département courant
		$req = "SELECT count(*) FROM test_membres WHERE dep = '$dep_num'";
		$res = mysqli_query($cx,$req) or die("Erreur : problème de requête pour déterminer le nombre de membres.");
 
		$total_new = mysqli_fetch_array($res);
		$total_new = $total_new["count(*)"];
 
 
		if ($total_new != $total_xml)
		{
			$dep_nom = $dep->getAttribute("nom"); // On récupère le nom
			$dep->setAttribute("total", $total_new); // Mis à jour du total dans le XML
 
 
			if ($total_new == 0) {
				$texte = $dep_nom . utf8_encode(" (aucun membre)");
			} elseif ($total_new == 1) {
				$texte = $dep_nom . utf8_encode(" (1 membre)");
			} elseif ($total_new > 1) {
				$texte = $dep_nom . utf8_encode(" (" . $total_new . " membres)");
			}
 
			$dep->nodeValue=$texte; // Mis à jour du noeud
		}
 
	}
Merci d'avance pour votre aide.
gilloddon est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h06.


 
 
 
 
Partenaires

Hébergement Web