IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[SimpleXML] Filtrage d'un document XML


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Par défaut [SimpleXML] Filtrage d'un document XML
    Bonjour,
    je suis nouveau sur le forum ainsi qu'en php, j'ai parcouru le forum de long en large, j'y ai trouvé une partie de la solution à mon problème, et donc il m'en manque un bout.
    voila, j'ai le flux xml suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    <CatalogueProduits>
    <produit>
    <CodeArticle>GGGG</CodeArticle>
    <MarqueArticle>CCCCC</MarqueArticle>
    <Nom>AAAA</Nom>
    <Description>
    bla bla bla bla
    </Description>
    <Url>http://www.xxx.com/</Url>
    <LienImage>
    http://www.xxx.com/images/range/rrrr_1g.jpg
    </LienImage>
    <DelaiLivraison>2-5 jours</DelaiLivraison>
    <FraisLivraison>.</FraisLivraison>
    <PrixTTC>000</PrixTTC>
    <Rayon>zzzzzz</Rayon>
    </produit>
    que je parse avec le script suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    <?php
    $CatalogueProduits = simplexml_load_file('http://www.xxxx.com/flux.xml');
     
    foreach($CatalogueProduits->produit as $produit) {
    if ($produit->Rayon == "zzzzz" )
        echo $produit->valeur;
         break;
        }
    echo '<table width="500">';
    echo '<tr>';
    echo '<td colspan="2">',utf8_decode($produit->Nom).'</td>';
    echo '<td colspan="2">',utf8_decode($produit->Rayon).'</td>';
    echo '</tr>';
    echo '<td rowspan="1"><img src="'.($produit->LienImage).'"></td>';
    echo '<tr>';
    echo '<td colspan="2">',utf8_decode($produit->Description).'</td>';
    echo '</tr>';
    echo '<tr>';
    echo '<td align="left">',utf8_decode($produit->PrixTTC).' €</td>';
    echo '<td align="left"><a href="'.($produit->Url).'" target="_blank">Achetez maintenat</a></td>';
    echo '</tr>';
    echo '</table>';
    ?>
    qui fonctionne, mais le problème est que ça ne m'affiche qu'un article alors que je voudrai que ça affiche tous les produits correspondant à la valeur zzzzz de l'attribut Rayon.
    Merci d'avance pour vos réponses.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Le code ne tient pas de debout : actuellement vous mettez fin à l'itération foreach dès le premier article (instruction break inconditionnelle).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php
    $CatalogueProduits = simplexml_load_file('http://www.xxxx.com/flux.xml');
     
    foreach ($CatalogueProduits->produit as $produit) {
        if ($produit->Rayon == "zzzzz" ) {
            echo '<table width="500">';
            echo '<tr>';
            echo '<td colspan="2">',utf8_decode($produit->Nom).'</td>';
            echo '<td colspan="2">',utf8_decode($produit->Rayon).'</td>';
            echo '</tr>';
            echo '<td rowspan="1"><img src="'.($produit->LienImage).'"></td>';
            echo '<tr>';
            echo '<td colspan="2">',utf8_decode($produit->Description).'</td>';
            echo '</tr>';
            echo '<tr>';
            echo '<td align="left">',utf8_decode($produit->PrixTTC).' €</td>';
            echo '<td align="left"><a href="'.($produit->Url).'" target="_blank">Achetez maintenat</a></td>';
            echo '</tr>';
            echo '</table>';
        }
    }
    Mais il manque potentiellement des choses (htmlentities ou htmlspecialchars sur certaines données qui sont ensuite intégrées dans des balises HTML notamment).

    Sinon, pour filtrer de façon plus "directe", il y a XPath (avec sa méthode éponyme).

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Par défaut
    Merci de votre réponse, mais je vous l'ai dit dans mon premier post, je suis totalement novice en php, désolé.
    J'ai donc recherché XPath (avec sa méthode éponyme), et j'ai remplacé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach($CatalogueProduits->produit as $produit) {
    if ($produit->Rayon == "zzzzz" )
    echo $produit->valeur;
    break;
    }
    par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($CatalogueProduits->xpath('produit[@Rayon = "zzzzz"]') as $h) {
        echo $h->Nom;
    };
    je pense que l'idée y est, mais ça ne fonctionne pas.
    Pouvez vous me mettre sur la voie ?
    Merci encore.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Rayon n'est pas un attribut : il suffit de retirer l'arobase devant celui-ci dans l'expression.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Par défaut
    bon bin, il doit y avoir une erreur ailleurs, car même en retirant l'arobase, ça ne change rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($CatalogueProduits->xpath('produit[Rayon = "zzzzz"]') as $h) {
        echo $h->Nom;
    };

  6. #6
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonjour,

    Je pense que c'est parce que le noeud produit n'est pas situé à la racine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //produit[Rayon/text() = "zzzzz"]
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /CatalogueProduits/produit[Rayon/text() = "zzzzz"]

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Par rapport aux éléments, tels qu'ils sont donnés, ça me semble correct (surtout ayant testé). Il manque un z à la valeur ? La valeur comprend des caractères spéciaux (accentués, par exemple) et l'expression n'est pas encodée en UTF-8 ?

    Citation Envoyé par ThomasR Voir le message
    Je pense que c'est parce que le noeud produit n'est pas situé à la racine
    Non, ce n'est pas une obligation : SimpleXML est capable de gérer des chemins relatifs.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Par défaut
    en effet, la valeur comprend des caractères spéciaux

    En fait, il y a plusieurs rayons avec plusieurs produits par rayons, et je voudrai donc que tous les produits du même rayon s'affichent sur une page car dans le document XML tout les rayons sont mélangés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <CatalogueProduits>
     
    <produit>
    <CodeArticle>GGGG</CodeArticle>
    <MarqueArticle>XXXX</MarqueArticle>
    <Nom>YYYYY</Nom>
     
    <Description>
    bla bla bla
    </Description>
    <Url>http://www.xxxx.com/</Url>
     
    <LienImage>
    http://www.xxxx.com/images/range/1g.jpg
    </LienImage>
    <DelaiLivraison>2-5 jours</DelaiLivraison>
    <FraisLivraison>.</FraisLivraison>
    <PrixTTC>0.00</PrixTTC>
    <Rayon>Beauté</Rayon>
    </produit>
     
    <produit>
    <CodeArticle>BBBBBB</CodeArticle>
    <MarqueArticle>XXXXX</MarqueArticle>
    <Nom>LLLLLLL</Nom>
     
    <Description>
    bla bla bla
    </Description>
    <Url>http://www.xxxx.com/</Url>
     
    <LienImage>
    http://www.xxxxxx.com/images/range/2g.jpg
    </LienImage>
    <DelaiLivraison>2-5 jours</DelaiLivraison>
    <FraisLivraison>.</FraisLivraison>
    <PrixTTC>00.00</PrixTTC>
    <Rayon>Santé</Rayon>
    </produit>
    quand j'utilise le script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?php
    $CatalogueProduits = simplexml_load_file('http://www.xxxx.com/flux.xml');
     
    foreach($CatalogueProduits->produit as $produit) {
    if ($produit->Rayon == "zzzzz" )
        echo $produit->valeur;
         break;
        }
    echo '<table width="500">';
    echo '<tr>';
    echo '<td colspan="2">',utf8_decode($produit->Nom).'</td>';
    echo '<td colspan="2">',utf8_decode($produit->Rayon).'</td>';
    echo '</tr>';
    echo '<td rowspan="1"><img src="'.($produit->LienImage).'"></td>';
    echo '<tr>';
    echo '<td colspan="2">',utf8_decode($produit->Description).'</td>';
    echo '</tr>';
    echo '<tr>';
    echo '<td align="left">',utf8_decode($produit->PrixTTC).' €</td>';
    echo '<td align="left"><a href="'.($produit->Url).'" target="_blank">Achetez maintenant</a></td>';
    echo '</tr>';
    echo '</table>';
    ?>
    ça fonctionne, mais ça n'affiche que le premier produit du rayon beauté au lieu de tous les afficher, et si je reprend vos exemples, ou ça n'affiche rien, ou ça affiche l'image cassée, le € et la phrase "Achetez maintenant".

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Vous avez normalement déjà toutes les réponses pour faire ce que vous voulez.

    Par contre, SimpleXML, comme vous aviez pu le noter, renvoie de l'UTF-8, donc si votre script n'est pas encodé en UTF-8, le test suivant ne sera jamais vérifié s'il contient des caractères "spéciaux" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($produit->Rayon == "zzzzz" )
    Il faudrait soit encoder (utf8_encode) la valeur statique de comparaison, soit décoder (utf8_decode) $produit->Rayon.

    A présent, sans prendre en compte nos remarques ni fournissant tous les détails et des codes complets/concrets, nous ne pouvons rien dire de plus.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Par défaut
    je prend en compte vos remarque, et j'essaie de les appliquer, mais j'ai un peu de mal
    voici l'url du fichier xml http://www.conua.com/flux_affiliate/...ance_conua.xml

    Voici mon script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?php
    $CatalogueProduits = simplexml_load_file('http://www.conua.com/flux_affiliate/direct_voyance_conua.xml');
     
    foreach($CatalogueProduits->produit as $produit) {
    if ($produit->Rayon == "Beauté" )
    echo $produit->valeur;
    break; 
    }
    echo $produit->valeur;
    echo '<table width="500">';
    echo '<tr>';
    echo '<td colspan="2">',utf8_decode($produit->Nom).'</td>';
    echo '<td colspan="2">',utf8_decode($produit->Rayon).'</td>';
    echo '</tr>';
    echo '<td rowspan="1"><img src="'.($produit->LienImage).'"></td>';
    echo '<tr>';
    echo '<td colspan="2">',utf8_decode($produit->Description).'</td>';
    echo '</tr>';
    echo '<tr>';
    echo '<td align="left">',utf8_decode($produit->PrixTTC).' €</td>';
    echo '<td align="left"><a href="'.($produit->Url).'" target="_blank">Achetez maintenant</a></td>';
    echo '</tr>';
    echo '</table>';
    ?>

    et voila ce que ça donne http://www.direct-voyance.net/boutique/index.php

    Désolé, mais j'ai réellement du mal a comprendre n'ayant pas de base en php et encore moins en simplexml.

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Donc, par rapport à ce qui a été dit précédemment, si le script est en ISO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $CatalogueProduits = simplexml_load_file('http://www.conua.com/flux_affiliate/direct_voyance_conua.xml');
     
    foreach($CatalogueProduits->produit as $produit) {
        if (utf8_decode($produit->Rayon) == "Beauté") {
            echo $produit->valeur;
            echo '<table width="500">';
            echo '<tr>';
            echo '<td colspan="2">',utf8_decode($produit->Nom).'</td>';
            echo '<td colspan="2">',utf8_decode($produit->Rayon).'</td>';
            echo '</tr>';
            echo '<td rowspan="1"><img src="'.($produit->LienImage).'"></td>';
            echo '<tr>';
            echo '<td colspan="2">',utf8_decode($produit->Description).'</td>';
            echo '</tr>';
            echo '<tr>';
            echo '<td align="left">',utf8_decode($produit->PrixTTC).' €</td>';
            echo '<td align="left"><a href="'.($produit->Url).'" target="_blank">Achetez maintenant</a></td>';
            echo '</tr>';
            echo '</table>';
        }
    }
    J'ai conservé votre affichage (où il doit manquer certaines choses, comme indiqué plus tôt).

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Par défaut
    merci beaucoup, vous êtes génial, c'est exactement ça

    vous allez dire que j'abuse un peu, mais sous cette forme la est -il possible d'y intégrer un moteur de recherche ?

    Encore merci pour votre aide.

  13. #13
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Ça dépend ce qu'on appelle "moteur de recherche". On peut parfaitement réaliser du filtrage +/- trivial et limité. (éventuellement avec xpath directement ou la SPL : un filtre sur un itérateur - pas forcément la plus adaptée).

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Par défaut
    je pensai faire une recherche en tapant le nom d'un produit, mais bon on verra ça plus tard.

    merci.

Discussions similaires

  1. Filtrage dans un document XML à l'aide d'un fichier XSLT
    Par lsebe2 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 01/04/2015, 17h42
  2. [SimpleXML] Enregistrer un document XML de manière formatée
    Par Paul75 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 31/05/2008, 11h52
  3. [SimpleXML] Lecture d'un document XML avec PHP 4
    Par FredericB dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 21/02/2008, 17h49
  4. [SimpleXML] Lecture d'un document XML
    Par shivka dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 31/10/2007, 20h12
  5. [SimpleXML] parser un document xml distant
    Par turican2 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 22/05/2007, 15h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo