Aller au contenu

Extraire des données d'un XML


Alainp

Sujets conseillés

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



Lien vers le commentaire
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...

Lien vers le commentaire
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 !

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...