Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML
XML Forum d'entraide sur XML avec PHP. Exemples : SimpleXML, OpenXML... Avant de poster -> FAQ XML, Cours XML et Sources XML
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 03/09/2011, 20h19   #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 Parser du XML plus facilement

Bonjour, je me permet de créer un nouveau sujet afin de savoir s'il existe une solution plus simple (et moins "couteuse" qu'un foreach) pour récupérer une information d'un fichier XML.

Pour la petite histoire, il y a une carte de France qui permet à l'utilisateur de sélectionner un département. Le numéro du département est transmis via l'url (liste.php?dep=XX). Je souhaite donc afficher le numéro (ça c'est bon, il est déjà dans l'url) et le nom du département qui correspond. Mon petit bout de code ci-dessous fonctionne pour récupérer le nom, mais je souhaiterais savoir s'il n'y a pas d'autres solutions plus simple et surtout, moins couteuse qu'un foreach (heureusement que je ne souhaite pas recenser toutes les villes, ça serait bien long de parcourir tout le fichier) ?

Étant donné que chaque département à un attribut "num" unique, n'est-il pas possible de récupérer directement une information quelconque (que ça soit la valeur du noeud ou un attribut) lié à ce numéro, et ce, sans avoir à parcourir tout les autres départements ?


Code qui me permet d'extraire le nom d'un département :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
		$dep_num = $_GET['dep']; // numéro du département transmis via l'URL (à partir de la carte)
 
 
		// initialisation du XML
		$dom = new DomDocument();
		$dom->load('datas.xml');
 
 
		$liste_dep = $dom->getElementsByTagName("dep");  // On liste tout les départements
		foreach($liste_dep as $dep)
		{
			// On récupère le nom du département qui correspond au numéro
			if ($dep->getAttribute("num") == $dep_num)
			{
				$dep_nom = utf8_decode($dep->nodeValue);  // Nom du département (valeur du noeud), avec décodage utf8 pour les accents
				break; // inutile de continuer
			}
		}


Code du fichier XML :
1
2
3
4
5
6
7
8
<departements>
		<region name="Bretagne" enable="true" href="#" zoomable="true">
			<dep num='29' href='liste.php?dep=29'>Finistère</dep>
			<dep num='22' href='liste.php?dep=22'>Côtes-d'Armor</dep>
			<dep num='56' href='liste.php?dep=56'>Morbihan</dep>
			<dep num='35' href='liste.php?dep=35'>Ille-et-Vilaine</dep>
		</region>
</departements>


2. Je souhaite ensuite faire évoluer mon fichier XML : est-il possible de rajouter un attribut "personnalisé" (comme nombre='XXX') et ensuite pouvoir récupérer la valleur "nombre" d'un département précis ?


Merci d'avance pour votre aide.
gilloddon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 20h46   #2
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Regardes peut-être du côté de DOMXPath.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2011, 11h30   #3
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
Merci du conseil, cette solution m'évite effectivement de parcourir tous les départements.

Par contre, le query retourne un DOMNodelist, et il n'y a pourtant qu'un département (une ligne du XML) qui est retournée. Je n'arrive donc pas à faire un echo pour afficher directement la valeur du noeud.
Je suis obligé de mettre un petit foreach (certes peu couteux étant donné qu'il n'y a qu'un département), mais n'est-il pas possible de faire autrement ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
	$dom = new DomDocument();
	$dom->load('datas.xml');
 
	$xpath = new domxpath($dom);
 
	$dep_num = $_GET['dep'];
 
	$liste = $xpath->query("//departements/region/dep[@num=$dep_num]");
 
	foreach ($liste as $dep) {
		echo utf8_decode($dep->nodeValue);
	}
gilloddon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2011, 12h20   #4
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
J'ai finalement trouvé la solution, grâce à item(0).
Merci ABCIWEB pour m'avoir conseillé le XPath

Code :
1
2
3
4
5
6
7
8
9
10
	$dep_num = $_GET['dep'];
 
	$dom = new DomDocument();
	$dom->load('datas.xml');
 
	$xpath = new domxpath($dom);
 
	$req = $xpath->query("//departements/region/dep[@num='$dep_num']");	
 
	echo utf8_decode($req->item(0)->nodeValue);
gilloddon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2011, 20h55   #5
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Citation:
Envoyé par gilloddon Voir le message
J'ai finalement trouvé la solution, grâce à item(0).
Merci ABCIWEB pour m'avoir conseillé le XPath
Oui c'est puissant le xpath. Pour ceux que ça intéressent il y a une doc bien faite ici
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h40.


 
 
 
 
Partenaires

Hébergement Web