Faut il un parseur XML ou tout réécrire ?

Résolu
Utilisateur anonyme - 15 janv. 2010 à 09:27
 Utilisateur anonyme - 16 janv. 2010 à 21:44
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
A voir également:

20 réponses

pysco68 Messages postés 681 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 21 août 2014 8
15 janv. 2010 à 10:57
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
3
Utilisateur anonyme
15 janv. 2010 à 13:19
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
0
pysco68 Messages postés 681 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 21 août 2014 8
15 janv. 2010 à 13:25
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
0
Utilisateur anonyme
15 janv. 2010 à 13:41
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pysco68 Messages postés 681 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 21 août 2014 8
15 janv. 2010 à 15:19
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
0
Utilisateur anonyme
16 janv. 2010 à 18:37
<?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 ?
0
pysco68 Messages postés 681 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 21 août 2014 8
16 janv. 2010 à 18:42
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
0
Utilisateur anonyme
16 janv. 2010 à 19:00
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 ....
0
Utilisateur anonyme
16 janv. 2010 à 19:05
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";
}

?>
0
Utilisateur anonyme
16 janv. 2010 à 19:08
Je n'ai plus aucune erreur, apr contre je n'ai RIEN qui s'affiche du tout !

Page blanche
0
Utilisateur anonyme
16 janv. 2010 à 19:12
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....
0
pysco68 Messages postés 681 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 21 août 2014 8
16 janv. 2010 à 20:16
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
0
Utilisateur anonyme
16 janv. 2010 à 21:15
oui effectivement... ca m'aide : mem le print_r me renvoie rien ....
0
pysco68 Messages postés 681 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 21 août 2014 8
16 janv. 2010 à 21:17
hmmm... laisse moi quelques minutes...


- Pysco68
0
Utilisateur anonyme
16 janv. 2010 à 21:21
je cherche aussi de mon côté !
0
pysco68 Messages postés 681 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 21 août 2014 8
16 janv. 2010 à 21:22
$xmlobj->weather->forecast_information->postal_code->attributes()->data

Lire aide... c'était dans le tuto...
- Pysco68
0
Utilisateur anonyme
16 janv. 2010 à 21:35
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);

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


- Pysco68
0
Utilisateur anonyme
16 janv. 2010 à 21:38
ca a l'air bon ! je reteste sur d'autres propriétés pour voir
0
Utilisateur anonyme
16 janv. 2010 à 21:44
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....
0
Rejoignez-nous