XML et Miniville

Fabs
Invité n'ayant pas de compte PHPfrance

22 août 2007, 14:30

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

Fabs
Invité n'ayant pas de compte PHPfrance

22 août 2007, 14:41

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....

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

22 août 2007, 14:42

Il faut utiliser les fonctions SimpleXML intégrées à PHP5

http://fr2.php.net/simple_xml
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

22 août 2007, 14:43

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

Fabs
Invité n'ayant pas de compte PHPfrance

22 août 2007, 15:07

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

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

22 août 2007, 15:14

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()
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

22 août 2007, 15:16

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!!

Fabs
Invité n'ayant pas de compte PHPfrance

22 août 2007, 15:20

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.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

22 août 2007, 20:26

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.