Welcome to Webmaster Hub

Inscrivez-vous maintenant pour avoir accès à toutes les fonctionnalités.

Une fois inscrit et identifié, vous pourrez contribuer à ce site en soumettant votre propre contenu ou en répondant au contenu existant. Vous pourrez éditer votre profil et communiquer avec les autres membres par messagerie privée.

Ce message sera supprimé une fois que vous serez identifié !

Alainp

Extraire des données d'un XML

Noter ce sujet :

Bonjour,


Je cale complètement sur le traitement d'un fichier XML dont voici un extrait :



- <product class="pointData">
- <time datatype="forecast" from="2013-04-21T12:00:00Z" to="2013-04-21T12:00:00Z">
- <location altitude="132" latitude="43.3000" longitude="5.3800">
<temperature id="TTT" unit="celcius" value="15.2" />
<windDirection id="dd" deg="302.4" name="NW" />
<windSpeed id="ff" mps="5.3" beaufort="3" name="Lett bris" />
<humidity value="50.8" unit="percent" />
<pressure id="pr" unit="hPa" value="1015.6" />
<cloudiness id="NN" percent="50.8" />
<fog id="FOG" percent="0.0" />
<lowClouds id="LOW" percent="18.8" />
<mediumClouds id="MEDIUM" percent="17.2" />
<highClouds id="HIGH" percent="38.3" />
</location>
</time>
- <time datatype="forecast" from="2013-04-21T09:00:00Z" to="2013-04-21T12:00:00Z">
- <location altitude="132" latitude="43.3000" longitude="5.3800">
<precipitation unit="mm" value="0.0" />
<symbol id="PARTLYCLOUD" number="3" />
</location>
</time>
- <time datatype="forecast" from="2013-04-21T06:00:00Z" to="2013-04-21T12:00:00Z">
- <location altitude="132" latitude="43.3000" longitude="5.3800">
<precipitation unit="mm" value="0.0" />
<symbol id="LIGHTCLOUD" number="2" />
</location>
</time>
- <time datatype="forecast" from="2013-04-21T15:00:00Z" to="2013-04-21T15:00:00Z">
- <location altitude="132" latitude="43.3000" longitude="5.3800">
<temperature id="TTT" unit="celcius" value="15.5" />
<windDirection id="dd" deg="311.3" name="NW" />
<windSpeed id="ff" mps="6.2" beaufort="4" name="Laber bris" />
<humidity value="50.5" unit="percent" />
<pressure id="pr" unit="hPa" value="1013.8" />
<cloudiness id="NN" percent="62.5" />
<fog id="FOG" percent="0.0" />
<lowClouds id="LOW" percent="27.3" />
<mediumClouds id="MEDIUM" percent="36.7" />
<highClouds id="HIGH" percent="36.7" />
</location>
</time>

Je récupère et j'affiche toutes les données de la ligne <time datatype="forecast" from="2013-04-21T09:00:00Z" to="2013-04-21T12:00:00Z">


mais je voudrai extraire et afficher la valeur de la ligne <temperature id="TTT" unit="celcius" value="15.2" /> uniquement lorsque les valeurs de "from" et de "to" sont identiques



J'ai du mal en XML et je ne sais pas comment imbriquer cela.


Pour info je suis en php5 et je tente d'utiliser (en vain) la fonction getElementsByTagName


Merci par avance si vous pouvez m'aider ou me guider



0

Partager ce message


Lien à poster
Partager sur d’autres sites

<?php

$szXML = <<<EOT

<product class="pointData">

<time datatype="forecast" from="2013-04-21T12:00:00Z" to="2013-04-21T12:00:00Z">-

<location altitude="132" latitude="43.3000" longitude="5.3800">

<temperature id="TTT" unit="celcius" value="15.2" />

<windDirection id="dd" deg="302.4" name="NW" />

<windSpeed id="ff" mps="5.3" beaufort="3" name="Lett bris" />

<humidity value="50.8" unit="percent" />

<pressure id="pr" unit="hPa" value="1015.6" />

<cloudiness id="NN" percent="50.8" />

<fog id="FOG" percent="0.0" />

<lowClouds id="LOW" percent="18.8" />

<mediumClouds id="MEDIUM" percent="17.2" />

<highClouds id="HIGH" percent="38.3" />

</location>

</time>

<time datatype="forecast" from="2013-04-21T15:00:00Z" to="2013-04-21T15:00:00Z">-

<location altitude="132" latitude="43.3000" longitude="5.3800">

<temperature id="TTT" unit="celcius" value="15.5" />

<windDirection id="dd" deg="311.3" name="NW" />

<windSpeed id="ff" mps="6.2" beaufort="4" name="Laber bris" />

<humidity value="50.5" unit="percent" />

<pressure id="pr" unit="hPa" value="1013.8" />

<cloudiness id="NN" percent="62.5" />

<fog id="FOG" percent="0.0" />

<lowClouds id="LOW" percent="27.3" />

<mediumClouds id="MEDIUM" percent="36.7" />

<highClouds id="HIGH" percent="36.7" />

</location>

</time>

</product>

EOT;

SimpleXML :

$xml = simplexml_load_string($szXML);

foreach($xml->time as $time):

if((string) $time['from'] == (string) $time['to']):

print $time->location->temperature['value'];

endif;

endforeach;

(précision, dans la condition, je caste en string -avec (string)- car il s'agit d'objet, sans cast, fort à parier que cela retourne false)

Tu peux envisager un truc avec DOM aussi :

$dom = new DOMDocument();

$dom->loadXML($szXML);

$timeNodes = $dom->getElementsByTagName('time');

foreach($timeNodes as $time):

if( $time->getAttribute('from') == $time->getAttribute('to')):

print $time->getElementsByTagName('location')->item(0)->getElementsByTagName('temperature')->item(0)->getAttribute('value') ;

endif;

endforeach;

La conclusion : DOMDocument n'est quand même pas idéal à utiliser dans ton cas, peut être plus performant si tu traites un gros fichier, mais bon...

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour SStephane,



Cà me guide car je ne savais pas par où commencer pour cette histoire de date.


Je vais essayer ces 2 méthodes


0

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello,



Bonne chance et... je retire ce que j'ai dit sur DOMDocument : http://p0l0.binware.org/wp-content/uploads/2011/07/300x203xXML-1000-100-300x203.png.pagespeed.ic.Vm75GAcX_4.png (Sauf à ce qu'il y ait eu des MAJ dans l'implémantation, pas de gain de perf avec DD selon plusieurs sources, même des pertes).



En gros, utilise la première méthode, en terme de relecture de code, c'est quand même beaucoup plus simple !

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant