Faut il un parseur XML ou tout réécrire ? [Résolu]

Signaler
-
 Utilisateur anonyme -
Bonjour,

Je bosse sur un flux XML que je trouve très bizarre (mais c'est peut etre moi qui me trompe !). Ce flux est généré par google meteo. Je vous en livre une partie :

[i]<xml_api_reply version="1">

<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0">

<forecast_information>
<city data="Nancy, Lorraine"/>

<latitude_e6 data=""/>
<longitude_e6 data=""/>
<forecast_date data="2010-01-15"/>
<current_date_time data="2010-01-15 07:00:00 +0000"/>

</forecast_information>

<current_conditions>
<condition data="Ciel nuageux"/>
<temp_f data="34"/>
<temp_c data="1"/>
<humidity data="Humidité : 87 %"/>

<wind_condition data="Vent : E à 2 km/h"/>
</current_conditions>
....
</weather>
</xml_api_reply>/i

J'aimerais simplement savoir s'il est possible de récupérer facilement les éléments "paramètres" QUI SONT EN FAIT DANS les balises XML (a l'interieur de < et > (c'est justement ca qui me gene) et non tels que DONNEES.
En fait, généralement on a DONNEES et là avec simpleXML j'arrive a récupérer les données. Dans le cas précis du flux copié-collé, y a t il une solution pour récupérer ces paramètres (avec simpleXML ou une autre bibliothèque) ou faut il écrire un parseur propre a ce flux ?

Merci de votre aide

20 réponses

Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
7
Bonjour,

enfait il faut que tu accède à un attribut d'un élément (par exemple l'attribut "data" de l'élément "humidity") ce qui est facilement faisable à l'aide de SimpleXML par exemple:

j'ai trouvé ce petit tuto (en anglais): http://www.electrictoolbox.com/php-simplexml-element-attributes/

J'espère que ça t'aide!

Bonne journée
- Pysco68

ouais... mais j'ai du mal !
[b]<?php

$xml = "http://www.google.com/ig/api?weather=nancy&hl=fr";
$xmlobj = new SimpleXMLElement($xml);
$xmlobj->items->item[0]->forecast_information->city()->data;

?>
/b

ce qui me donne


Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 1: parser error : Start tag expected, '<' not found in /googleWeather/GWeather.php5 on line 4

Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: http://www.google.com/ig/api?weather=nancy&hl=fr in /googleWeather/GWeather.php5 on line 4

Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: ^ in /googleWeather/GWeather.php5 on line 4

Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in /googleWeather/GWeather.php5:4 Stack trace: #0 /googleWeather/GWeather.php5(4): SimpleXMLElement->__construct('http://www.goog...') #1 {main} thrown in /googleWeather/GWeather.php5 on line 4
Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
7
Dans l'exemple ils ne changent pas un fichier xml depuis une source externe, mais l'intègrent en dur à peux code source.

Avec file_get_contents() http://fr.php.net/manual/en/function.file-get-contents.php tu devrais arriver à tes fins!


- Pysco68

J'avais pas pensé a ca effectivement, je regarde. mais voila, pas bcp mieux !
[b]<?php


$string = "http://www.google.com/ig/api?weather=nancy&hl=fr";
$xml = file_get_contents($string);
foreach($xml->weather->forecast_information->postal_code()->data as $a => $b) {
echo $a,'="',$b,""\n";
}


?>
/b

et j'obtiens
Fatal error: Call to a member function postal_code() on a non-object in /googleWeather/GWeather.php5 on line 6

Les () servent a koi ?
Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
7
Tu t'en approche!

$xmlobj = new SimpleXMLElement($xml);
est toujours encore nécessaire!!! Il fut quand même encore parser le XML que tu télécharge :P

Allé, t'y est presque!


- Pysco68

<?php
$string = "http://www.google.com/ig/api?weather=nancy&hl=fr";
$xml = file_get_contents($string);
$xmlobj = new SimpleXMLElement($xml);
foreach($xml->weather->forecast_information->postal_code()->data as $a => $b) {
echo $a,'="',$b,""\n";
}

?>

Et là j'ai

Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 1: parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xE9 0x20 0x3A 0x20 in /meteo_test.php5 on line 4

Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: <condition data=""/><temp_f data="37"/><temp_c data="3"/><humidity data="Humidit in /meteo_test.php5 on line 4

Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: ^ in /meteo_test.php5 on line 4

Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in /meteo_test.php5:4 Stack trace: #0 /meteo_test.php5(4): SimpleXMLElement->__construct('<?xml version="...') #1 {main} thrown in /meteo_test.php5 on line 4

Je suppose que ce n'est plus qu'un probleme d'encodage du flux de départ ?
Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
7
Bonne supposition, enfait c'est le flux XML dont l'encodage UTF8 est un peux abimé (d'ou les séquences hexa), essai voir avec ca:

$xml = iconv("UTF-8","UTF-8//IGNORE",$xml);




- Pysco68

C'est au bon endroit iConv là ?

<?php
$string = "http://www.google.com/ig/api?weather=nancy&hl=fr";
$xml = file_get_contents($string);
$xml = iconv("UTF-8","UTF-8//IGNORE",$xml);
$xmlobj = new SimpleXMLElement($xml);
foreach($xml->weather->forecast_information->postal_code()->data as $a => $b) {
echo $a,'="',$b,""\n";
}

?>

ca a l'air bien, je n'ai plus qu'une erreur :
Fatal error: Call to a member function postal_code() on a non-object in /meteo_test.php5 on line 6

Il ne veux ps me sortir Postal_code qui nn'est qu'une propriété a sortir parmi tant d'autres ....

en rajoutant un UTF8_encode avant file_get_content, j'ai effectivement pas mal de messages d'erreurs de disparus !
Il m'a mis une erreur sur postaal_code() ce que je comprends puisque postalçconde n'est pas une fonction mais une des proprietes du flux
Je dosi rebooter, j'arrive pu a me logger au FTP.... J'ai des connexions penndantes restées ouevrtes !

<?php
$string = "http://www.google.com/ig/api?weather=nancy&hl=fr";
$xml = file_get_contents($string);
$xml = iconv("UTF-8","UTF-8//IGNORE",$xml);
$xmlobj = new SimpleXMLElement($xml);
foreach($xmlobj->weather->forecast_information->postal_code->data as $a => $b) {
echo $a,'="',$b,""\n";
}

?>

Je n'ai plus aucune erreur, apr contre je n'ai RIEN qui s'affiche du tout !

Page blanche

Je n'ai plus aucune erreur, par contre je n'ai RIEN qui s'affiche du tout !

Page blanche

Ca sert a quoi $a => $b ? J'aurais eu tendance a simplement écrire $a....
Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
7
j'en sais rien c'est toi qui à écrit le foreach... (ou copié)

essai de faire un print_r() de $xmlobj->weather->forecast_information->postal_code->data

Peut-être que ca t'aidera...

- Pysco68

oui effectivement... ca m'aide : mem le print_r me renvoie rien ....
Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
7
hmmm... laisse moi quelques minutes...


- Pysco68

je cherche aussi de mon côté !
Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
7
$xmlobj->weather->forecast_information->postal_code->attributes()->data

Lire aide... c'était dans le tuto...
- Pysco68

j'ai aucune differences
<?php
$string = "http://www.google.com/ig/api?weather=nancy&hl=fr";
$xml = file_get_contents($string);
$xml = iconv("UTF-8","UTF-8//IGNORE",$xml);
$xmlobj = new SimpleXMLElement($xml);

print_r($xmlobj->weather->forecast_information->postal_code->attributes());
foreach($xmlobj->weather->forecast_information->postal_code->attributes()->data as $a => $b) {
//echo $a,'="',$b,""\n";
echo $a." ".$b."
";
}

print_r($xmlobj->weather->current_condition->temp_c);

?>
Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
7
essai voir: print_r($xmlobj->weather->forecast_information->postal_code->attributes()->data);


- Pysco68

ca a l'air bon ! je reteste sur d'autres propriétés pour voir

maintenant un autre truc me chiffonne : dans la boucle foreach, on ne recupere qu'une propriete. Mais j'ai besoin de refaire uen autre boucle pour les autres propriete ou le peux utiliser la meme et faisant par exemple :

...
foreach($xmlobj->weather->forecast_information->postal_code->attributes()->data as $a => $b) {
echo $a." ".$b."
";
}

foreach($xmlobj->weather->forecast_information->forecast_date->attributes()->data as $a => $b) {
echo $a." ".$b."
";
}

etc... mais ca fait une boucle par propriete ! pas top au niveau optimisation....