Parser un flux XML en PHP pour récupérer une valeur

Parser un flux XML en PHP pour récupérer une valeur - PHP - Programmation

Marsh Posté le 10-02-2011 à 17:16:40    

Salut :)
 
J'ai un flux XML que je veux parser en PHP. J'utilise simplexml_load_file.

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <catalogue id="1">
  3. <progname>Panzani</progname>
  4. <store>
  5.   <name>Panzani Pasta</name>
  6.   <products>
  7.    <product>
  8.     <storeData>
  9.      <data type="modele">Farfale</data>
  10.      <data type="prix_catalogue">3.35</data>
  11.     </storeData>
  12.   </product>
  13.   </products>
  14. </store>
  15. </catalogue>


J'arrive sans souci à récupérer la valeur de "progname" (Panzani ici), store->name mais je ne vois pas du tout coment récupérer la donnée Farfale par exemple.
J'ai testé par store->products->product->storeData->data['modele'] mais ça ne marche pas. Pourquoi ?? Comment faire ?
 
Un grand merci :bounce:

Reply

Marsh Posté le 10-02-2011 à 17:16:40   

Reply

Marsh Posté le 10-02-2011 à 17:43:41    

Il faut utiliser les XPath

Reply

Marsh Posté le 10-02-2011 à 17:47:40    

Mais les XPath c'est pas pour faire une recherche ?

Reply

Marsh Posté le 10-02-2011 à 18:04:37    

Salut,
 
Comment veux-tu que SimpleXML comprenne qu'il est question de l'attribut type lorsque tu écris :

store->products->product->storeData->data['modele']


Tu peux utiliser XPath à la racine (attention ça retourne un tableau d'objets SimpleXMLElement) :

$xml->xpath('/catalogue/store/products/product/storeData/data[@type=\'modele\']')


Si tu as l'intention de parcourir la liste des produits, tu peux utiliser XPATH à l'intérieur de la boucle des produits :

foreach ($xml->store->products->product as $product)
{
    $data   = $product->xpath('storeData/data[@type=\'modele\']');
    $modele = (isset($data[0])) ? (string) $data[0] : null;    
}


Mais si tu as l'intention de récupérer toutes les données de type data, pourquoi ne pas tous récupérer ou traiter en fonction de l'attribut type ?

foreach ($xml->store->products->product as $product)
{
    $data = array();
     
    foreach ($product->storeData->data as $node) {
        $data[(string) $node['type']] = (string) $node;
    }
     
    print_r($data);
}

Reply

Marsh Posté le 10-02-2011 à 18:21:46    

Merci beaucoup mais je viens de trouver largement plus simple (enfin je crois).
 
Pour récupérer Farfale, j'ai finis par trouver :
store->products->product->storeData->data[0];
Bon ce qui m'embête c'est que je n'ai pas de détrompeur pour savoir si 0 correspond bien à "modele".

Reply

Marsh Posté le 10-02-2011 à 18:40:41    

C'est peut-être plus simple et ça fonctionne techniquement mais c'est faux fonctionnellement parlant car justement, rien de prouve que tu récupères bien le modèle (alors que c'est quand même le but ici).
Il suffit d'inverser les balises <data> pour obtenir des données incohérentes.
 
Si tu prends ce risque juste pour avoir des lignes de code en moins ou parce qu'elles semblent compliquées, c'est une erreur.
La cohérence des données doit être placée au dessus de tout.
Après, tu fais ce que tu veux...


Message édité par Bloubinouchko le 10-02-2011 à 18:41:44
Reply

Marsh Posté le 10-02-2011 à 18:44:05    

Je demande à apprendre c'est tout.

 

En fait je veux récupérer le flux, le lire et tout stocker dans une base de données Mysql (moulinette une fois par jour).

 

Il faut que dans ma boucle foreach j'ajoute celle ci c'est ça ?
foreach ($xml->store->products->product as $product)
{
    $data   = $product->xpath('storeData/data[@type=\'modele\']');
    $modele = (isset($data[0])) ? (string) $data[0] : null;    
}

 

Des données du type
<data type="modele">Farfale</data>
Il y en a 10 à récupérer, et il y a 500 produits.


Message édité par vanquishV12 le 10-02-2011 à 18:44:47
Reply

Marsh Posté le 10-02-2011 à 18:45:33    

PS : un grand merci pour ton aide et ton temps...

 

EDIT : ok yébon j'ai pris la dernière solution qui est bien moins bancale que la mienne, un grand merci j'aurais cherché des années.

 

C'est sympa :)


Message édité par vanquishV12 le 10-02-2011 à 18:48:28
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed