Page 1 sur 1

XML et Miniville

Posté : 22 août 2007, 14:30
par Fabs
Bonjour,

Une question des plus bete qui va en faire sourire plus d'un :

Je connais un peu le php et pas du tout le XML, or je voudrais intégrer les info que donne le site miniville dans mon propre site pour creer ensuite des liens.

Voici un exemple :http://paris.miniville.fr/xml

Merci de votre aide

Ps je n'ose mettre la vraie ad de mon site j'ai trop honte.

Fab

1er essai

Posté : 22 août 2007, 14:41
par Fabs
Voila ce que j'ai fait pour l'instant :
<?php 
$source = @file_get_contents("http://paris.miniville.fr/xml"); 

preg_match_all ("!<name>(.*?)</name>!i", $source, $name, PREG_PATTERN_ORDER); 

for ($j = 0; $j < (count($name[0])); $j++) 
    { 
        echo $name[0][$j]."<br /><br />"; 
    } 


preg_match_all ("!<unemployment>(.*?)</unemployment>!i", $source, $unemployment, PREG_PATTERN_ORDER); 

for ($j = 0; $j < (count($unemployment[0])); $j++) 
    { 
        echo $unemployment[0][$j]."<br /><br />"; 
    } 

?> 
Bon ca marche mais il doit y avoir moin lourd....

Posté : 22 août 2007, 14:42
par mere-teresa
Il faut utiliser les fonctions SimpleXML intégrées à PHP5

http://fr2.php.net/simple_xml

Posté : 22 août 2007, 14:43
par Hubert Roksor
Rien de plus facile avec SimpleXML mais attention, ne va pas télécharger le XML de Miniville à chaque page parce que ça prend pas mal de temps de récupérer une page extérieure au site et ça surcharge le serveur de Miniville pour rien.

Dans cet exemple, on garde une copie du fichier en local, et on la met à jour toutes les heures (fichiers plus datant de plus de 3600 secondes)
$file = 'c:\\tmp\\miniville.xml';

if (!file_exists($file) || filemtime($file) < time() - 3600)
{
	file_put_contents($file, file_get_contents('http://paris.miniville.fr/xml'));
}

// j'essaie de toujours nommer la variable PHP du nom de l'élément racine
$city = simplexml_load_file($file);

echo 'Population: ', $city->population;
http://php.net/manual/ref.simplexml.php

Posté : 22 août 2007, 15:07
par Fabs
Merci pour ce bout de code qui en plus m'a permis de comprendre un peu mieu xml mais j'ai quand meme un soucis, j'ai toujour le message suivant en retour :
Fatal error: Call to undefined function: file_put_contents() in /monsite/xml.php on line 27

Posté : 22 août 2007, 15:14
par mere-teresa
Merci pour ce bout de code qui en plus m'a permis de comprendre un peu mieu xml mais j'ai quand meme un soucis, j'ai toujour le message suivant en retour :
Fatal error: Call to undefined function: file_put_contents() in /monsite/xml.php on line 27
Vérifie ta version de PHP, par un simple appel à phpinfo()

Posté : 22 août 2007, 15:16
par Hubert Roksor
Tu dois utiliser une ancienne version de PHP alors... du coup il te faut remplacer file_put_contents() par fopen() et fwrite() mais aussi oublier SimpleXML et utiliser quelque chose comme DOMXML ou faire des preg_match() comme dans ton précédent exemple.

PS: mais arrêtez de poster une minute avant moi!!

Posté : 22 août 2007, 15:20
par Fabs
Voila :
PHP Version 4.3.10-22
Je crois qu'il faut le 5 ? mais je ne crois pas que mon hébergeur va me faire ce plaisir pour si peu.

Posté : 22 août 2007, 20:26
par Hubert Roksor
Mon avis : songe sérieusement à trouver un hébergeur PHP 5. Sinon, voici quelques rustines qui devraient plus ou moins faire l'affaire.

Cette fonction fait à peu près la même chose que file_put_contents()
function file_put_contents($filepath, $contents)
{
	$fp = fopen($filepath, 'wb');
	fwrite($fp, $contents);
	fclose($fp);
}
Cette fonction fait moins d'un milliardième de ce qu'offre SimpleXML, mais suffit à faire fonctionner mon exemple précédent tant que Miniville ne change pas le format de son fichier XML :
function simplexml_load_file($filepath)
{
	$obj = new stdClass;

	if (preg_match_all('#<([^>]+)>(.*?)</\\1>#', file_get_contents($filepath), $tags, PREG_SET_ORDER))
	{
		foreach ($tags as $tag)
		{
			$obj->$tag[1] = $tag[2];
		}
	}

	return $obj;
}
Concernant le masque <([^>]+)>(.*?)</\\1> ça signifie
  • <([^>]+)>
    n'importe quoi entre < et > à l'exception d'un >
  • (.*?)
    suivi de "tout sauf un saut de ligne" (par défaut le point . correspond à tout charactère sauf un saut de ligne)
  • </\\1>
    suivi de </ puis de la même chose qu'il y avait dans les 1ères parenthèses, puis >
La fonction te renverra un objet (stdClass est la classe de base de PHP) dont les propriétés correspondent aux balises du machin de Miniville. J'insiste sur le fait qu'il s'agit d'une solution très bancale, qui ne survivra pas le jour où Miniville changera le format de ses données. D'un autre côté, si tu mets à jour PHP tu n'auras qu'à retirer les fonctions "bancales" et utiliser celles de base, plus sûres et plus rapides.