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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 38
    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.

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