Premiers pas avec xml

Eléphant du PHP | 168 Messages

17 déc. 2009, 17:48

Bonjour j'ai un fichier xml dont je voudrais récupérer les données dans des variables php. La structure du fichier ressemble à ceci:

Code : Tout sélectionner

<BIEN> <CODE_CLIENT></CODE_CLIENT> <TYPE_OFFRE>5</TYPE_OFFRE> <CODE_SOCIETE>6358</CODE_SOCIETE> <CODE_SITE>01</CODE_SITE> <NO_ASP>2307141</NO_ASP> <NO_DOSSIER>00194</NO_DOSSIER> <DATE_OFFRE>04/09/2007</DATE_OFFRE> <PRIX>300000</PRIX> <CP_OFFRE>92400</CP_OFFRE> <VILLE_OFFRE>COURBEVOIE</VILLE_OFFRE> <QUARTIER></QUARTIER> <SECTEUR>Courbevoie</SECTEUR> <CATEGORIE>LOCAL INDUST. / ACTIVITES</CATEGORIE> <NB_PIECES></NB_PIECES> <NB_CHAMBRES></NB_CHAMBRES> <SURF_HAB>225</SURF_HAB> <SURF_TERRAIN></SURF_TERRAIN> <NB_ETAGES>0</NB_ETAGES> </BIEN>
Sachant qu'il y a beaucoup de balise BIEN.
Je ne sais pas du tout comment faire pour récupèrer les données.
Quelqu'un peut m'aider svp. 8-| .Merci d'avance

Mammouth du PHP | 568 Messages

17 déc. 2009, 17:54


Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

21 déc. 2009, 01:37

Bonjour,

Voici un exemple avec simpleXML:
<?php
$url_fichier_xml="http://www.domaine.com/fichier.xml"; // Peut être une url ou un chemin relatif
$xml=simplexml_load_file($url);

foreach($xml->bien as $bien) {
     // On boucle sur chaque bien...
     print ($bien->VILLE_OFFRE)." : ".($bien->PRIX)." Euros <br />";
}
?>
A toi d'adapter cet exemple pour en faire ce que tu veux :)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 168 Messages

21 déc. 2009, 13:33

Merci beaucoup @rthur, tout marche nickel, je peux récupérer toutes les informations! :D

EDIT: Bon non, tout ne marche pas nickel, à l'intérieur de mon foreach je fais une autre boucle à partir d'un mysql_fetch_object contenant 300 enregistrements; mais cette boucle ne s'effectue q'une fois.
foreach($xml->BIEN as $bien) {
		while($entre = mysql_fetch_object($exec))
		{
		if($entre->BIEN_NUM_ASP == $bien->NO_ASP && ($bien->QUARTIER!="" && substr($bien->CP_OFFRE,0,2) == '75'))
		{
				$req = "select LOCAL_ID,LOCAL_QUARTIER,LOCAL_VILLE from localisation where LOCAL_CP =".$bien->CP_OFFRE." and LOCAL_QUARTIER = ".$bien->QUARTIER;
				$exec = mysql_query($req) or die("erreur dans la requete($req)");
				$tab = mysql_fetch_object($exec);
				while($sql = $tab)
				{
					echo $tab->LOCAL_ID.' '.$tab->LOCAL_QUARTIER.' '.$tab->LOCAL_VILLE;
				}
		}
		else if($entre->BIEN_NUM_ASP == $bien->NO_ASP) 
		{
			$req = 	"select LOCAL_ID,LOCAL_VILLE from localisation where LOCAL_CP =".$bien->CP_OFFRE." AND LOCAL_QUARTIER = ''";
			$exec = mysql_query($req) or die("erreur dans la requete($req)");
			while($sql = mysql_fetch_object($exec))
				{
					echo $entre->LOCAL_ID;	
				}		}	}
Pourquoi ma boucle ne se fait-elle qu'une seul fois?

Eléphant du PHP | 168 Messages

22 déc. 2009, 13:38

Excusez-moi, je souhaite faire une recherche dans une base de données Mysql à partir d'informations xml.
Je veux que chaque donnée de chaque ligne soit comparé à toute une colonne d'une table.
J'utilise donc un simpleparse_load_file sur lequel je fais un foreach sur une balise. A l'intérieur de ce foreach je construis une autre boucle sur le tableau des élèments de ma requête. Mais cette boucle ne s'execute qu'une seule fois. En revanche le fichier xml est lu en entier. Mon code:

Code : Tout sélectionner

foreach($xml->BIEN as $bien) { while($entre = mysql_fetch_object($exec)) { if($entre->BIEN_NUM_ASP == $bien->NO_ASP && ($bien->QUARTIER!="" && substr($bien->CP_OFFRE,0,2) == '75')) { $req = "select LOCAL_ID,LOCAL_QUARTIER,LOCAL_VILLE from localisation where LOCAL_CP =".$bien->CP_OFFRE." and LOCAL_QUARTIER = ".$bien->QUARTIER; $exec = mysql_query($req) or die("erreur dans la requete($req)"); $tab = mysql_fetch_object($exec); while($sql = $tab) { echo $tab->LOCAL_ID.' '.$tab->LOCAL_QUARTIER.' '.$tab->LOCAL_VILLE; } } else if($entre->BIEN_NUM_ASP == $bien->NO_ASP) { $req = "select LOCAL_ID,LOCAL_VILLE from localisation where LOCAL_CP =".$bien->CP_OFFRE." AND LOCAL_QUARTIER = ''"; $exec = mysql_query($req) or die("erreur dans la requete($req)"); while($sql = mysql_fetch_object($exec)) { echo $entre->LOCAL_ID; } } }
Modifié en dernier par jojo1000 le 22 déc. 2009, 15:51, modifié 1 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 déc. 2009, 15:21

Modération :
Les "up" sont interdits sur PHPFrance.

Si tu n'as pas obtenu de réponse, c'est (au choix) :
- que ta question est mal formulée : reformule-la différemment ;
- que personne ne connaît la réponse ici : faire un "up" ne te donnera pas davantage de résultats ;
- que la réponse demandée exige un travail important que personne ne va faire à ta place ;
- que trop peu de temps s'est écoulé depuis ton précédent message pour qu'un membre ait pu y répondre.

Merci de prendre le temps de lire les règlements.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 672 Messages

22 déc. 2009, 16:23

1. Il manque une accolade à la fin de ton code pour fermer le foreach (mais c'est certainement juste une erreur de recopie).

2. Je n'ai jamais testé donc je ne garantis pas que le problème vient de là. Mais tu lances des requêtes dans ta boucle, et tu les récupères toujours dans la même variable $exec. Du coup, le $exec sur lequel tu fais le fetch au deuxième passage n'est plus le même qu'au premier...
Tu peux tester vite fait en utilisant des variables distinctes pour chaque requête.

Eléphant du PHP | 168 Messages

22 déc. 2009, 16:28

MacGawel, tu es mon sauveur; enfin presque, qu'on me file la bonne réponse comme ça et que tout marche... et ben non, j'ai encore des problèmes.
Merci, déjà j'ai changé le nom des $exec et on passe dans la deuxième boucle.
Par contre, on passe pas dans les boucles du if.
Je m'y attèle, mais je n'ai rien contre de l'aide.

Mammouth du PHP | 672 Messages

22 déc. 2009, 16:59

Règle numéro un pour débugger un script : étudier le contenu des variables.

Avant de faire tes tests, commence par regarder ce qu'il y a dans tes variables ($entre et $bien). Parce qu e si ça ne passe pas dans tes IF, et qu'il n'y a pas de message d'erreur, c'est certainement que $entre->BIEN_NUM_ASP != $bien->NO_ASP...

Eléphant du PHP | 168 Messages

22 déc. 2009, 17:06

=P~ Merci Macgawel, en fait après

Code : Tout sélectionner

while($entre = mysql_fetch_array($exec))
j'ai ajouté :

Code : Tout sélectionner

$requete ="select * from biens"; $exec = mysql_query($requete) or die("erreur dans ma requête");
Et ça roule. Merci pour ton aide prècieuse. =D>