Jump to content

Extraire des données d'un XML


Recommended Posts

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



Link to post
Share on other 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...

Link to post
Share on other 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 !

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...