Aller au contenu
Alainp

Récupérer 2 valeurs dans un fichier XML

Noter ce sujet :

Recommended Posts

Alainp    0

Bonjour,

Je sais que vous n'aimez pas trop donner des solutions toutes faites mais çà fait plusieurs jours que je cherche comment récupérer deux valeurs dans un fichier XML et je capitule.

Voici le fichier

 <?xml version="1.0" ?> 
- <weatherdata>
- <weather weatherlocationcode="wc:FRXX0016" weatherlocationname="Bordeaux, Gironde" zipcode="33300" encodedlocationname="Bordeaux%2c+Gironde" url="http://meteo.msn.com/local.aspx?wealocations=wc:FRXX0016&q=Bordeaux%2c+Gironde" imagerelativeurl="http://blst.msn.com/as/wea3/i/fr/" degreetype="C" provider="Foreca" attribution="Données fournies par Foreca" attribution2="© Foreca" lat="44.8557549" long="-0.5782283" timezone="1" alert="" entityid="4486">
<current temperature="19" skycode="32" skytext="Clair" date="2011-11-13" day="dimanche" shortday="dim." observationtime="17:00:00" observationpoint="Bordeaux / Merignac" feelslike="19" humidity="68" windspeed="15" winddisplay="15 km/h ESE" />
<forecast low="13" high="20" skycodeday="30" skytextday="En partie nuageux" date="2011-11-13" day="dimanche" shortday="dim." precip="5" />
<forecast low="11" high="19" skycodeday="30" skytextday="En partie nuageux" date="2011-11-14" day="lundi" shortday="lun." precip="5" />
<forecast low="10" high="15" skycodeday="39" skytextday="Averses / Temps clair" date="2011-11-15" day="mardi" shortday="mar." precip="95" />
<forecast low="8" high="16" skycodeday="30" skytextday="En partie nuageux" date="2011-11-16" day="mercredi" shortday="mer." precip="20" />
<forecast low="7" high="17" skycodeday="30" skytextday="En partie nuageux" date="2011-11-17" day="jeudi" shortday="jeu." precip="5" />
<toolbar timewindow="60" minversion="1.0.1965.0" />
</weather>
</weatherdata>

et je voudrai récupérer la valeurs des champs lat et long pour les afficher dans mon script PHP

lat="44.8557549" long="-0.5782283"

J'arrive à peu près à extraire des données lorsqu'il y a des balises ouvrantes et fermantes mais là, il n'y en a pas pour ces deux champs.

Merci par avance si vous pouvez m'aider

Partager ce message


Lien à poster
Partager sur d’autres sites
jcaron    11

Plusieurs méthodes:

- méthode bourrin avec une regex:


preg_match('/lat="([-0-9.]+)" long="([-0-9.]+)"/',$string,$matches)

- méthode je lis du XML, ça va dépendre de ce que tu utilises (XML Parser, SimpleXML...). En supposant que tu utilises SimpleXML:


$xml = simplexml_load_string($string);
$lat = (string)$xml->weather[0]->attributes()->lat;
$long = (string)$xml->weather[0]->attributes()->long;

(je n'ai rien testé, mais ça ne doit pas être très loin)

Jacques.

Partager ce message


Lien à poster
Partager sur d’autres sites
Alainp    0

- méthode je lis du XML, ça va dépendre de ce que tu utilises (XML Parser, SimpleXML...). En supposant que tu utilises SimpleXML:

Bonjour jcaron et merci

Malheureusement sur mon hébergement mutualisé, je n'ai pas SimpleXML.

Jusqu'à présent, je prenais des bouts de code trouvés sur le net et que je modifiais pour traiter les fichiers xml avec des fonctions du style lit_xml().

Je regarde la méthode bourrin.

Résultat:

Depuis ce matin, je me bagarre avec la méthode "bourin" mais en vain, aucun résultat

J'appelle l'url du fichier xml en guise de $string mais rien après traitement

Je continue de chercher comment extraire ces 2 champs lat et long

Merci quand même

Modifié par Alainp

Partager ce message


Lien à poster
Partager sur d’autres sites
Alainp    0

pense à ajouter l'option multilignes pour ton regex

Merci mais dans ce domaine, je suis complètement nul

Je continue mes recherches pour trouver un bout de script qui exploite le fichier xml de msn

Partager ce message


Lien à poster
Partager sur d’autres sites
Alainp    0

regarde s'ils ne proposent pas d'api

En fait, j'ai une base de données de plus de 50.000 villes dans le monde pour lesquelles je souhaite rajouter la latitude et la longitude pour chacune de ces villes.

Il n'y a que dans le fichier xml de msn météo que j'ai trouvé les codes de mes villes avec en parallèle, la latitude et la longitude

C'est pour cette raison que je cherche à extraire ces 2 champs de leur fichier xml sans avoir à le faire à la main vu la quantité de villes de ma base.

Partager ce message


Lien à poster
Partager sur d’autres sites

Pourquoi ne pas utiliser l'API de Google Maps (Ou toute autre API similaire) ? Ça me semblerait pourtant plus indiqué.

Partager ce message


Lien à poster
Partager sur d’autres sites
jcaron    11

Ah, je n'avais pas vu ça:

J'appelle l'url du fichier xml en guise de $string mais rien après traitement

Ah ben non, tu dois passer le XML que tu reçois (via un file_get_contents par exemple), pas l'URL...

Jacques.

Partager ce message


Lien à poster
Partager sur d’autres sites
Alainp    0

Pourquoi ne pas utiliser l'API de Google Maps (Ou toute autre API similaire) ? Ça me semblerait pourtant plus indiqué.

Depuis plusieurs années, j'utilisais les données fournies dans un fichier xml par un service météo. Ce dernier vient de remplacer l'accès gratuit par un accès payant (plus de 200$ par mois si je veux les mêmes données).

Résultat, je dois changer de fournisseur mais comme toutes mes pages sont référencées avec le code des villes et que le nouveau service que j'ai trouvé utilise la latitude et la longitude, je vais arranger mon script pour continuer d'utiliser le code ville.

Après recherche, seul le fichier xml de MSN permet d'avoir la correspondance code ville et latitude/longitude d'où mon besoin d'extraire ces deux champs de leur fichier xml

et je n'y arrive toujours pas!

Partager ce message


Lien à poster
Partager sur d’autres sites
Alainp    0

Ah ben non, tu dois passer le XML que tu reçois (via un file_get_contents par exemple), pas l'URL...

Merci jcaron, j'ai l'impression d'avoir un peu avancé avec cette idée.

En utilisant un file_get_contents + ta méthode "bourrin" sur le fichier xml mentionné dans mon premier post , voila ce que j'obtiens

lat="44.8557549" long="-0.5782283"44.8557549

C'est déjà un premier pas mais comment je peux conserver uniquement 44.8557549 et -0.5782283

Merci

Partager ce message


Lien à poster
Partager sur d’autres sites
Alainp    0

$matches[0] -> lat

$matches[1] -> long

Jacques.

C'est ce que j'ai fait :

$page = file_get_contents('http://weather.service.msn.com/data.aspx?s&weadegreetype=C&culture=fr-fr&wealocations=wc:FRXX0016');

preg_match('/lat="([-0-9.]+)" long="([-0-9.]+)"/',$page,$matches);
echo $matches[0];
echo $matches[1];

echo $matches[0]; donne lat="44.8557549"

echo $matches[1]; donne long="-0.5782283"44.8557549

D'ailleurs, je ne comprends pas que 44.8557549 soit collé derrière long="-0.5782283"

Partager ce message


Lien à poster
Partager sur d’autres sites
jcaron    11

Non, pas à l'intérieur de [].

Petite erreur de ma part, c'est $matches[1] et [2]. $matches[0] contient l'ensemble de ce qui a "matché", [1] et suivants chacune des expressions entre ().

Jacques.

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour info, $matches[0] récupérait en fait toute la chaîne lat="44.8557549" long="-0.5782283", alors que $matches[1] donnait la valeur de latitude. C'est pour ça que tu t'étonnais de les voir attachées.

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×