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] Filtrer des balises grâce à leurs attributs


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut [SimpleXML] Filtrer des balises grâce à leurs attributs
    Bonjour,

    J'utilise php et simplexml.

    Je rencontre actuellement le problème suivant :

    J'ai ce fichier xml

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <racine>
    <identifiant>toto</identifiant>
    <information1 type="a">blabla</information1>
    <information1 type="b">blibli</information1>
    <information2>bleble</information>
    <information3 type="a">bloblo</information1>
    <information3 type="b">blublu</information1>
    ...
    </racine>

    que j'ouvre ainsi $xml= simplexml_load_file('monFichier.xml');

    et j'aimerai filtrer les informations pour ne retenir que celles qui n'ont pas d'attribut et celles qui ont l'attribut type="a".

    Est-il possible de faire cela avec un xpath ?

    Encore mieux, est-il possible de faire cela sans passer par un xpath, en complétant cet appel $xml->information1 avec l'information type="a", directement sans passer par une condition if ?


    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    je pense que quelquechose de ce style te conviendra : ( http://fr2.php.net/manual/fr/functio...ment-xpath.php )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $xml= simplexml_load_file('monFichier.xml');
    $balises_avec_att_a_eq_1 = $xml->xpath('/racine/*[starts-with(name(), "information")][not(@type) or @type = "a"]');
    Que fait le XPath ? :

    Récupération des noeuds (~~balises) fils de <racine> dont le nom commence par "information" et qui n'ont pas d'attribut "type" ou dont l'attribut "type" vaut "a"
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    Bonjour et merci pour cette réponse.

    Je me suis mal exprimé lorsque j'ai dit "j'aimerai filtrer les informations",

    en fait pour le xml cité en exemple j'aimerai récupérer les infos

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $xml->identifiant (toto)
    $xml->information1 (blabla)
    $xml->information2 (bleble)
    $xml->information3 (bloblo)
    Lorsque j'utilise ta requête dans le xpath (que ce soit avec en condition type="a" ou type="b") et que je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $xml->information1
    je récupère systématiquement blabla ...

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    C'est parce qu'il te faut ensuite parcourir le résultat du XPath...

    et pas ton document XML (sinon effectivement ça sert à rien)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  5. #5
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Swoög
    C'est parce qu'il te faut ensuite parcourir le résultat du XPath...

    et pas ton document XML (sinon effectivement ça sert à rien)

    Mais dans ce cas là si je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $test=$xml->xpath('/racine/*[not(@type) or @type= "a"]');
    je suis obligé de récupérer les informations par un index, genre on ne peut pas parcourir par rapport au nom de la balise ?

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    si tu veux avoir un nom de balise spécifique, il te faut alors modifier le XPath en conséquence...

    celui que je t'ai donné récupèrera toutes les balises dont le nom commence par "information" ensuite, si tu ne veux que les balises "information1" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /racine/information1[not(@type) or @type = "a"]
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  7. #7
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    Merci pour les réponses.

    C'est dommage, ça rend les manipulations un peu lourdingue...

    J'aurais aimé une solution qui me permette de n'utiliser qu'un seul fichier xml tout en faisant l'impasse à un xml qui contient des informations redondantes de type

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <racine>
    <bloc type="a">
    <identifiant>toto</identifiant>
    <information1>blabla</information1>
    <information2>bleble</information>
    <information3>bloblo</information1>
    </bloc>
    <bloc type="b">
    <identifiant>toto</identifiant>
    <information1>blibli</information1>
    <information2>bleble</information>
    <information3>blublu</information1>
    </bloc>

    Le tout en évitant de faire trop d'appels via xpath.

  8. #8
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    dans ce cas, il te suffit de récupérer bloc avec un XPath...

    après tu as l'élément bloc, tu peux faire toutes tes manips, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $xml = simple_xml_load(...);
    $bloc = $xml->xpath('/racine/bloc[@type="a"]');
    $bloc = $bloc[1];
    echo $bloc->information1;
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  9. #9
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Swoög
    dans ce cas, il te suffit de récupérer bloc avec un XPath...

    après tu as l'élément bloc, tu peux faire toutes tes manips, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $xml = simple_xml_load(...);
    $bloc = $xml->xpath('/racine/bloc[@type="a"]');
    $bloc = $bloc[1];
    echo $bloc->information1;
    C'est sûr, mais le but de la manoeuvre était justement d'éviter d'avoir en double des informations comme la balise identifiant ayant la même valeur dans le bloc type="a" et dans le bloc type="b".

    Pas chiant le gars...

  10. #10
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Dans ce cas, il va te falloir modifier le tout... éventuellement, tu peux faire une petite fonction qui te retrie le tableau, mais le plus simple à l'air d'être de toutes façon l'utilisation "massive" d'XPath, ou alors il te faudra peut-être te tourner vers une autre lib XML (comme DOM)...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  11. #11
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    Bah, je vais séparer les infos en deux blocs distincts, et utiliser une fois le xpath, c'est encore la meilleure solution.

    C'est dommage qu'il n'y ait pas de variante à $xml->information1 avec la possibilité d'avoir un attribut en paramètre.

    En tout cas merci pour les suggestions !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Article] Liste des balises et de leurs enfants pour une validation XHTML 1.1
    Par giminik dans le forum Publications (X)HTML et CSS
    Réponses: 12
    Dernier message: 12/02/2018, 15h11
  2. [PowerShell] Comment filtrer des fichiers sur leur date de création
    Par Gusss dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 04/01/2010, 10h39
  3. [SimpleXML] Lecture d'un flux comportant des balises itunes
    Par yannux dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 23/11/2007, 12h49
  4. Référencement : attribut "title" des balises h
    Par prome dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 03/10/2007, 14h02
  5. Filtre d'affichage de balise selon leur attributs
    Par Norely dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 03/04/2003, 14h33

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