Faire une recherche inversée en XML

fluxx
Invité n'ayant pas de compte PHPfrance

18 févr. 2010, 17:02

Bonjour à tous,

Je suis actuellement en train de coder un site, sur lequel je dois utiliser des données géographiques. Du coup, j'ai constitué un fichier XML, avec le nom des régions et leurs départements :
<?xml version="1.0" encoding="UTF-8"?>
<region>
<nom_region>Île-de-France</nom_region>
	<departement>
		<code_dpt>75</code_dpt>
		<nom_dpt>Paris</nom_dpt>
	</departement>
	<departement>
		<code_dpt>77</code_dpt>
		<nom_dpt>Seine-et-Marne</nom_dpt>
		</departement>
	<departement>
		<code_dpt>78</code_dpt>
		<nom_dpt>Yvelines</nom_dpt>
	</departement>
	<departement>
		<code_dpt>91</code_dpt>
		<nom_dpt>Essonne</nom_dpt>
	</departement>
	<departement>
		<code_dpt>92</code_dpt>
		<nom_dpt>Hauts-de-Seine</nom_dpt>
	</departement>
	<departement>
		<code_dpt>93</code_dpt>
		<nom_dpt>Seine-Saint-Denis</nom_dpt>
	</departement>
	<departement>
		<code_dpt>94</code_dpt>
		<nom_dpt>Val-de-Marne</nom_dpt>
	</departement>
	<departement>
		<code_dpt>95</code_dpt>
		<nom_dpt>Val-d'Oise</nom_dpt>
	</departement>
</region>
<region>
	<nom_region>Picardie</nom_region>
	<chef_lieu>
		<code_chef>80021</code_chef>
		<nom_chef>Amiens</nom_chef>
	</chef_lieu>
	<departement>
		<code_dpt>02</code_dpt>
		<nom_dpt>Aisne</nom_dpt>
	</departement>
	<departement>
		<code_dpt>60</code_dpt>
		<nom_dpt>Oise</nom_dpt>
	</departement>
	<departement>
		<code_dpt>80</code_dpt>
		<nom_dpt>Somme</nom_dpt>
	</departement>
</region>
<region>
<nom_dpt>Nord-Pas-de-Calais</nom_dpt>
	<chef_lieu>
		<code_chef>59350</code_chef>
		<nom_chef>Lille</nom_chef>
	</chef_lieu>
	<departement>
		<code_dpt>59</code_dpt>
		<nom_dpt>Nord</nom_dpt>
	</departement>
	<departement>
		<code_dpt>62</code_dpt>
		<nom_dpt>Pas-de-Calais</nom_dpt>
	</departement>
</region>
ETC...

Et je me demande, comment je peux parcourir ce fichier, de sorte que, je puisse retrouver à partir du code "59", contenu dans la balise <code_dpt>, le nom du département (Nord - <nom_dpt>) et la région (Nord Pas de Calais - <nom_region>).
J'imagine que cela se passe avec DOM, mais n'y connaissant rien, je voulais avoir votre avis... Je suis tombé sur ce tuto : http://eusebius.developpez.com/php5dom/#L3.2 , mais je ne vois pas du tout comment adapter l'exemple; il ne s'agit pas vraiment d'une recherche à partir de la valeur contenue entre 2 balises....


Merci par avance de m'aiguiller;

ViPHP
ViPHP | 5462 Messages

18 févr. 2010, 17:04


fluxx
Invité n'ayant pas de compte PHPfrance

18 févr. 2010, 17:20

Bonjour,

Merci pour ta réponse rapide. Je viens donc de faire une recherche sur Xpath, et je suis tombé sur ce tuto : http://www.journaldunet.com/developpeur ... l-1d.shtml. Le problème est encore une fois qu'ici on cherche les balises, or, moi j'aimerais faire une recherche à partir du contenu d'une balise.

Merci en tous cas pour ton aide.

ViPHP
ViPHP | 5462 Messages

18 févr. 2010, 17:27

tu peu rechercher du contenu avec xpath avec la fonction "contains"
	$dom = new DomDocument();
	$dom->load('test.xml');
	
	$xpath 	= new DOMXPath($dom);
	$search = $xpath->query("//code_dpt[contains(.,'75')]")->item(0);
	
	$region = $search->parentNode->parentNode->getElementsByTagName('nom_region')->item(0)->textContent;
	$ville 	= $search->parentNode->getElementsByTagName('nom_dpt')->item(0)->textContent;

	echo $region . ' ' . $ville;
	//Île-de-France Paris
attention a ton XML il a besoin d'un root

fluxx
Invité n'ayant pas de compte PHPfrance

18 févr. 2010, 20:44

Merci beaucoup, ça marche nickel !

fluxx
Invité n'ayant pas de compte PHPfrance

19 févr. 2010, 04:01

Bon, ben désolé, du coup, je suis de retour...
J'ai pas mal changé la présentation de mon fichier XML pour l'optimiser. J'ai a peu près réussi à adapter les tuyaux que tu m'as donné, mais c'est pas tout à fait ça. Voici le XML relooké :
<?xml version="1.0" encoding="ISO-8859-1"?>
<france>
<region>
	<nom_region id="1">Ile-de-France</nom_region>
	<nom_dpt id="75">Paris</nom_dpt>
	<nom_dpt id="77">Seine-et-Marne</nom_dpt>
	<nom_dpt id="78">Yvelines</nom_dpt>
	<nom_dpt id="91">Essonne</nom_dpt>
	<nom_dpt id="92">Hauts-de-Seine</nom_dpt>
	<nom_dpt id="93">Seine-Saint-Denis</nom_dpt>
	<nom_dpt id="94">Val-de-Marne</nom_dpt>
	<nom_dpt id="95">Val-d'Oise</nom_dpt>
</region>
<region>
	<nom_region id="2">Champagne-Ardenne</nom_region>
	<nom_dpt id="08">Ardennes</nom_dpt>
	<nom_dpt id="10">Aube</nom_dpt>
	<nom_dpt id="51">Marne</nom_dpt>
	<nom_dpt id="52">Haute-Marne</nom_dpt>
</region>
<region>
	<nom_region id="3">Picardie</nom_region>
	<nom_dpt id="02">Aisne</nom_dpt>
	<nom_dpt id="60">Oise</nom_dpt>
	<nom_dpt id="80">Somme</nom_dpt>
</region>
</france>
Et mon problème, c'est maintenant d'afficher le nom du département à partir de son id.
Voici mon script :
$search = $xpath->query("//nom_dpt[@id=77]")->item(0);
$dpt = $search->parentNode->getElementsByTagName('nom_dpt')->item(0)->textContent;
echo $dpt;
Tel que présenté ci-dessus, je voudrais que le script m'affiche le département 77, à savoir la Seine et Marne... Or, le script me retourne Paris...
Comment puis-je corriger cela ?

Merci par avance pour votre aide

ViPHP
ViPHP | 5462 Messages

19 févr. 2010, 04:24

un
$dpt = $search->textContent;
devrai faire l'affaire

fluxx
Invité n'ayant pas de compte PHPfrance

19 févr. 2010, 10:49

Effectivement, ça marche, un grand merci à toi stealth35 !

J'avoue que j'avais envisagé pas mal de combinaisons, mais pas celle là... J'ai pas encore bien intégré la logique, mais j'imagine que ça rentrera avec le temps, comme le reste ^^
En fait, ce qu'il m'affichait à chaque fois, c'était le nom du premier département de chaque région. Et quand je changeais item(0) en item(1), c'était le 2ème etc. Bref je tâtonne, mais c'est comme ça qu'on apprend, à défaut de trouver des tutos complets.

Merci beaucoup en tous cas pour ton aide précieuse.