Problème pour parser un XML

spaceshiponespaceshipone Member
avril 2010 modifié dans Entraide
Bonjour,
Voici mon problème :

J'ai un fichier XML qui se présente sous la forme :
<channel>
<item>
		<title>Paris, France</title>
		<link></link>
		<meteo:weather date="28 Avril" link="http://www.meteorologic.net/meteo-france/Oraison_1622.html" tempe_matin="13.8" namepictos_matin="Voilé"   pictos_matin="voile" tempe_midi="19.1" namepictos_midi="Voilé" pictos_midi="voile" tempe_apmidi="19.8" namepictos_apmidi="Couvert"   pictos_apmidi="couvert" tempe_soir="17" namepictos_soir="Couvert"   pictos_soir="couvert" />
		<meteo:weather date="29 Avril" link="http://www.meteorologic.net/meteo-france/Oraison_1622.html" tempe_matin="15.2" namepictos_matin="Dégagé"   pictos_matin="soleil" tempe_midi="19.9" namepictos_midi="Dégagé" pictos_midi="soleil" tempe_apmidi="21.1" namepictos_apmidi="Dégagé"   pictos_apmidi="soleil" tempe_soir="16.2" namepictos_soir="Dégagé"   pictos_soir="soleil" />
		<meteo:weather date="30 Avril" link="http://www.meteorologic.net/meteo-france/Oraison_1622.html" tempe_matin="12.5" namepictos_matin="Voilé"   pictos_matin="voile" tempe_midi="17.9" namepictos_midi="Nuageux" pictos_midi="nuageux" tempe_apmidi="19.7" namepictos_apmidi="Dégagé"   pictos_apmidi="soleil" tempe_soir="15.1" namepictos_soir="Dégagé"   pictos_soir="soleil" />
		
		<pubDate>Wed, 28 Apr 2010 09:44:16 +0100</pubDate>
</item></channel>
Lorsque j'utilise ma fonction pour le parser, les éléments meteo n'apparaissent pas. J'aimerai savoir pourquoi et comment puis je les récuperer.

Voici ma fonction pour parser :
$xml = simplexml_load_file('mon_fichier.xml') ;
$data='';
foreach($xml->channel->item as $item) 
{
	$titre=$item->title;
	//Si la ville n'est pas trouvée, on retourne NO
	if($titre == 'City not found')
	{
		$data = "NO";
	}
	else
	{
		$lien=$item->link; 
		$data .= $lien."<br><br>";
		$data .= $titre."<br><br>";

				
		$explode_weather = explode('<meteo:weather',$item->meteo);
		for($i=1;$i<count($explode_weather);$i++)
		{
			$data .= self::extract_data($explode_weather[$i])."<br>";
		}
	}
}
return $data;
et voici le résultat que ça me donne quand je fais un print_r($xml);
SimpleXMLElement Object
(
   [channel] => SimpleXMLElement Object
        (

            [item] => SimpleXMLElement Object
                (
                    [title] => Paris, France
                    [link] => 
                   
                    [pubDate] => Wed, 28 Apr 2010 09:44:16 +0100
                )

        )

)

Réponses

  • KurosKuros Member
    Bonjour,

    Je ne suis pas un spécialiste, mais il y a une chose qui me saute au yeux:
    <link></link>
            <meteo:weather date="28 Avril" link="http://www.meteorologic.net/meteo-france/Oraison_1622.html" tempe_matin="13.8" namepictos_matin="Voilé"   pictos_matin="voile" tempe_midi="19.1" namepictos_midi="Voilé" pictos_midi="voile" tempe_apmidi="19.8" namepictos_apmidi="Couvert"   pictos_apmidi="couvert" tempe_soir="17" namepictos_soir="Couvert"   pictos_soir="couvert" />
            <meteo:weather date="29 Avril" link="http://www.meteorologic.net/meteo-france/Oraison_1622.html" tempe_matin="15.2" namepictos_matin="Dégagé"   pictos_matin="soleil" tempe_midi="19.9" namepictos_midi="Dégagé" pictos_midi="soleil" tempe_apmidi="21.1" namepictos_apmidi="Dégagé"   pictos_apmidi="soleil" tempe_soir="16.2" namepictos_soir="Dégagé"   pictos_soir="soleil" />
            <meteo:weather date="30 Avril" link="http://www.meteorologic.net/meteo-france/Oraison_1622.html" tempe_matin="12.5" namepictos_matin="Voilé"   pictos_matin="voile" tempe_midi="17.9" namepictos_midi="Nuageux" pictos_midi="nuageux" tempe_apmidi="19.7" namepictos_apmidi="Dégagé"   pictos_apmidi="soleil" tempe_soir="15.1" namepictos_soir="Dégagé"   pictos_soir="soleil" />
    
    Le "</link>" est mal placé, il devrait se trouver après tes éléments météo.
  • non la balise <link> est comme la balise <title> et elle contient un url donc elle est bien placé, ça ne vient pas de ça
  • KurosKuros Member
    Mais as-tu essayé comme cela:
    <link>
            <meteo:weather date="28 Avril" link="http://www.meteorologic.net/meteo-france/Oraison_1622.html" tempe_matin="13.8" namepictos_matin="Voilé"   pictos_matin="voile" tempe_midi="19.1" namepictos_midi="Voilé" pictos_midi="voile" tempe_apmidi="19.8" namepictos_apmidi="Couvert"   pictos_apmidi="couvert" tempe_soir="17" namepictos_soir="Couvert"   pictos_soir="couvert" />
            <meteo:weather date="29 Avril" link="http://www.meteorologic.net/meteo-france/Oraison_1622.html" tempe_matin="15.2" namepictos_matin="Dégagé"   pictos_matin="soleil" tempe_midi="19.9" namepictos_midi="Dégagé" pictos_midi="soleil" tempe_apmidi="21.1" namepictos_apmidi="Dégagé"   pictos_apmidi="soleil" tempe_soir="16.2" namepictos_soir="Dégagé"   pictos_soir="soleil" />
            <meteo:weather date="30 Avril" link="http://www.meteorologic.net/meteo-france/Oraison_1622.html" tempe_matin="12.5" namepictos_matin="Voilé"   pictos_matin="voile" tempe_midi="17.9" namepictos_midi="Nuageux" pictos_midi="nuageux" tempe_apmidi="19.7" namepictos_apmidi="Dégagé"   pictos_apmidi="soleil" tempe_soir="15.1" namepictos_soir="Dégagé"   pictos_soir="soleil" />
    </link>
    
  • c'est un flux que je récupère selon le résultat de la ville, je peux pas le changer. Mais le <link> ne doit pas contenir les balises meteo
  • KurosKuros Member
    Je vais surveiller de près la réponse, car le sujet m'intéresse beaucoup.
  • StéphaneStéphane Member, Former PluXml Project Manager
    la balise meteo contient un namespace weather. voilà pourquoi tu ne récupères rien. il faut adapter ton code pour prendre en compte ce namespace

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • et comment on le prend en compte ?

  • Cordialement,
    gcyrillus , simple membre du forum et utilisateur de pluxml

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • salut,
    $explode_weather = explode('<meteo:weather',$item->meteo);
            for($i=1;$i<count($explode_weather);$i++)
            {
                $data .= self::extract_data($explode_weather[$i])."<br>";
            }
    
    Ce code n'est pas bon car "meteo" est un espace de nom et non un tag.
    Utilise la méthode $item -> children('meteo') pour récupérer tous les noeuds <meteo:weather> comme ceci :
    $weathers = $item -> children('meteo');
    foreach($weathers as $weather) {
          $data.= 'lien :'.$weather['link'].'<br />;
          $data.= 'date :'.$weather['date'].'<br />;
          etc.....
    
    }
    
    Je n'ai pas testé mais normalement, cela devrait ok pour récupérer les infos.
    @+
  • je viens de voir que SimpleXML est incompatible avec les documents qui comportent des espaces de noms par exemple donc je crois bien que je vais utiliser DOM
  • re-,
    je viens de voir que SimpleXML est incompatible avec les documents qui comportent des espaces de noms par exemple donc je crois bien que je vais utiliser DOM
    ça dépend de ta version de php. Ca fonctionne en 5.3
    Je te renvoie à cet article qui te donne une astuce si le nom du namespace n'est pas pris en compte.
    http://www.journaldunet.com/developpeur/tutoriel/php/040921-php-seguy-simplexml-1e.shtml
    @+
Connectez-vous ou Inscrivez-vous pour répondre.