Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1483 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2055891
vanquishV1​2
se coucher tard nuit
Posté le 10-02-2011 à 17:16:40  profilanswer
 

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:

mood
Publicité
Posté le 10-02-2011 à 17:16:40  profilanswer
 

n°2055899
smaragdus
whores, drugs & J.S. Bach
Posté le 10-02-2011 à 17:43:41  profilanswer
 

Il faut utiliser les XPath

n°2055903
vanquishV1​2
se coucher tard nuit
Posté le 10-02-2011 à 17:47:40  profilanswer
 

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

n°2055911
Bloubinouc​hko
Posté le 10-02-2011 à 18:04:37  profilanswer
 

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);
}

n°2055913
vanquishV1​2
se coucher tard nuit
Posté le 10-02-2011 à 18:21:46  profilanswer
 

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".

n°2055921
Bloubinouc​hko
Posté le 10-02-2011 à 18:40:41  profilanswer
 

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
n°2055922
vanquishV1​2
se coucher tard nuit
Posté le 10-02-2011 à 18:44:05  profilanswer
 

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
n°2055923
vanquishV1​2
se coucher tard nuit
Posté le 10-02-2011 à 18:45:33  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
[PHP-RegEx] Remplacer des expressions par des caractèresRécupérer une variable Javascript avec AJAX
Validation XML en Java - Problème de namespaceParser du texte dans la langue française.
Problème de validation XML via SAXPHP autorise htaccess
[PHP] Insérer un array dans un lien hypertexte[Résolu][PHP/SQL] Ajout variable données inscrite dans bdd par tierce
[PHP] Comment parser un XML sans racine ? 
Plus de sujets relatifs à : Parser un flux XML en PHP pour récupérer une valeur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR