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] Quelle classe XML utiliser ?


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre confirmé Avatar de FrontLine
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 173
    Par défaut [SimpleXML] Quelle classe XML utiliser ?
    Bonjour,

    je cherche une classe pour le XML, jusqu'à maintenant j'utilisais le script Magpierss qui devient obsolète avec PHP5.

    Je penche fortement vers la class DOM de php5 pour la manipulation XML mais avant de m'engager vers une classe qui peut être comporte des vilaines subtilités je préfère demander.

    Pouvez-vous dire quelle classe XML vous utilisez et pourquoi svp ?

    Rapidité, simplicité, sécurité, stabilité sont forcément des critères de choix

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 505
    Par défaut
    Personnellement, je manipule très peu d'XML, mais chaque fois que je dois le faire j'utilise simpleXML, il rencontre deux de vos critère : Rapidité, simplicité.

  3. #3
    Membre confirmé Avatar de FrontLine
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 173
    Par défaut
    Merci pour le retour

    Suite à la lecture de pas mal d'article et tuto il semble effectivement que simpleXML a été fais pour la lecture de source XML, donc plus rapide et plus léger vue qu'il a été fais et optimisé pour ça.

    Par contre il a moins de possibilité de manipulation que DOM par exemple.

    Du coup je me dis que faire une classe qui fusionne simpleXML pour la lecture et DOM pour des manipulations plus poussées serait peut être l'idéal non ?

  4. #4
    Membre émérite

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Par défaut
    Je prefere xmlreader, mais je ne me suis jamais servi d'xmlwriter.
    C'est nettement plus rapide que simplexml, on ne peut pas le ratter avec des fichiers xml assez gros (>50M).
    En theorie, xmlwriter est egalement plus rapide.
    Par contre, pour les RSS, j'utiliserai directement Feed (anglais).

  5. #5
    Membre confirmé Avatar de FrontLine
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 173
    Par défaut
    Merci je ne connaissais pas XMLreader, hélas il y a très peu d'info (tuto) mis à part PHP.net & copie.

    Si j'ai bien compris les classes DOM et simpleXML charge le XML dans la mémoire et XMLreader lis le fichier XML en streaming un peu comme le fait Mysql ?

  6. #6
    Membre émérite

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Par défaut
    C'est certain pour xmlReader: a part si une variable avec le fichier de 100M lui est passee ...
    A priori, DOM charge la totalite du document seulement, je n'exclue pas qu'il existe une feinte permettant d'eviter ce desagrement.
    Les conseils de nos confreres utilisateurs de DOM m'interressent egalement, puisqu'aucune discussion a ce sujet n'existe sur developpez.net.

    Je rappelle toutefois que certains d'entre eux ont pris la peine de partager un peu de leur experience:
    http://jerome.developpez.com/xmlxsl/...lpage=&rpage=4
    http://fr.php.net/simplexml
    http://php.developpez.com/cours/?page=bibliotheques#xml
    http://php.developpez.com/faq/?page=xml

    Sinon j'ai des examples aussi:
    simple
    un peu complexe

    PS: Je viens de comprendre, tout les commentaires d'utilisateurs ont disparu sur la page de la doc ... L'equipe competente est au courant a present.

    En attendant qu'ils les retrouvent ou demandent le repostage, voici un code utile:
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <?php
    class debugXMLReader extends XMLReader {
      /**
       * This is a table to translate a node type verbosely.
       * @var array
       */
      public $aNodeTypes = array (
        0=>"No node type",
        1=>"Start element",
        2=>"Attribute node",
        3=>"Text node",
        4=>"CDATA node",
        5=>"Entity Reference node",
        6=>"Entity Declaration node",
        7=>"Processing Instruction node",
        8=>"Comment node",
        9=>"Document node",
        10=>"Document Type node",
        11=>"Document Fragment node",
        12=>"Notation node",
        13=>"Whitespace node",
        14=>"Significant Whitespace node",
        15=>"End Element",
        16=>"End Entity",
        17=>"XML Declaration node"
      );
     
      /**
       * Returns a complete debugging array with all current's node info.
       * @return array Returns an array with all current's node info.
       */
      public function dump() {
        $dump = array();
        $dump['attributeCount'] = $this->attributeCount;
        $dump['baseURI'] = $this->baseURI;
        $dump['depth'] = $this->depth;
        $dump['hasAttributes'] = $this->hasAttributes ? 'TRUE' : 'FALSE';
        $dump['hasValue'] = $this->hasValue ? 'TRUE' : 'FALSE';
        $dump['isDefault'] = $this->isDefault ? 'TRUE' : 'FALSE';
        $dump['isEmptyElement'] = @$this->isEmptyElement ? 'TRUE' : 'FALSE';
        $dump['localName'] = $this->localName;
        $dump['name'] = $this->name;
        $dump['namespaceURI'] = $this->namespaceURI;
        $dump['nodeType'] = $this->nodeType;
        $dump['nodeTypeVerbose'] = $this->aNodeTypes[$this->nodeType];
        $dump['namespaceURI'] = $this->namespaceURI;
        $dump['prefix'] = $this->prefix;
        $dump['value'] = $this->value;
        $dump['xmlLang'] = $this->xmlLang;
        return $dump;
      }
    }
    ?>

  7. #7
    Membre confirmé Avatar de FrontLine
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 173
    Par défaut
    Merciii !

    J'ai vu ton code ce matin, j'ai pu remplacer facilement Magpierss par simplexml grâce à tes liens. Le débugueur ça le fait aussi merci, je vais l'utiliser quand j'aurais trouvé des exemples d'utilisations de xmlreader (principalement pour les gros fichiers) car xmlreader à l'air super mais n'est pas facile à appréhender.

    Sans abuser de ton aide, je suis preneur si tu trouves une solution pour feinter le chargement total du document avec DOM. Je te tiens au courant si je trouve de mon coté.

    Bon week-end

  8. #8
    Membre confirmé Avatar de FrontLine
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 173
    Par défaut
    Après pas mal de recherche je n'arrive pas à faire fonctionner correctement xmlreader pour afficher un flux rss, je m'y prends mal c'est sûr mais je ne vois pas où est mon erreur.

    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
    $reader = new XMLReader();
     
       $reader->open( $fichier );
     
    $i = 0;
       while( $reader->read() ) {
       	$i++;
            switch ($reader->nodeType) {
                 case (XMLREADER::ELEMENT):
                switch( $reader->localName ) {
     
                   case "title":
                      $reader->read();
                      $title = utf8_decode($reader->value);
                   break;
                   case "link" :
                      $reader->read();
                      $link = $reader->value;
                   break;
                   case "description" :
                      $reader->read();
                      $description = utf8_decode($reader->value);
                   break;
                   case "pubDate" :
                      $reader->read();
                      $pubDate = $reader->value;
                      $date = date("d/m/Y",strtotime($pubDate));
                   break;          
     
             }
             break;
             CASE (XMLREADER::END_ELEMENT) :
               $code .= '<p><b>'.$i.'</b> ['.$date.'] <a href="'.$link.'" title="'.$title.'">'.$title.'</a><br />'.$description.'<br /><br />----------------</p>';
     
             break; 
          }
       } 
     
       $reader->close();
    207 boucles ($i) alors qu'il y a seulement 10 entreès dans le flux, ce n'est pas normal non ?
    Page générée en 0.365 sec | Mémoire : 484320 (473 ko)

    Le même flux avec simplexml :
    10 boucles ($i), normal puisqu'il y a 10 entrées.
    Page générée en 0.351 sec | Mémoire : 435408 (425 ko)

    simplexml est plus rapide et consomme moins de mémoire, ça devrait être l'inverse.

    Une idée de mon erreur svp ?
    Quelqu'un aurait un exemple correct pour lire un flux svp ?
    Là en 3 jours de recherche et de test je n'ai pas pu mieux faire

  9. #9
    Membre émérite

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Par défaut
    Je ne voie pas l'interet non plus, avec un fichier xml de dix entrees.
    J'ai constate une differrence de 150% avec un fichier xml de 100M, c'est ce dont je parlais.
    PS: C'est un profiler comme xdebug + kCacheGrind qu'il faut utiliser pour chercher ou optimiser.

  10. #10
    Membre confirmé Avatar de FrontLine
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 173
    Par défaut
    Bein l'intérêt est d'utiliser la même classe pour tout, je n'ai pas seulement des flux RSS à traiter mais avec un exemple simple pour le Flux RSS j'arriverais à le reproduire sur d'autres formes et surtout voir ce qui ne va pas avec mon traitement du Flux (cf le code du 1er post).

    C'est normal toutes ces boucles avec xmlreader ? Ca te le fait aussi ?

    Pour le débug j'utilise aussi Xdebug par contre je ne connaissais pas kCacheGrind, je vais y jeter un oeil merci

    Edit: Ca a l'air très intéressant kCacheGrind mais il est pour KDE et je suis sous Gnome (Ubuntu)...

  11. #11
    Membre émérite

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Par défaut
    XMLReader est un parseur evenementiel, c'est donc normal de le faire boucler dans tout.
    Remarque: il est possible d'exporter un noeud XMLReader en object SimpleXML, reduisant ainsi le nombre de boucle, personnelement j'aime bien XMLReader donc je fait 100% de XMLReader. Apres, c'est une question de preference. C'est comme choisir entre un eclair au chocolat ou au cafe hahaha ....

    Au fait, kCacheGrind ne necessite que les bibliotheques de QT me semble-t-il. Au pire, il suffit d'installer les dependances meme si elles ne seront utiles que pour ce logiciel.

    Il parait qu'un script en perl permet de le faire en console, mais je n'arrive jamais a le trouver.

  12. #12
    Membre confirmé Avatar de FrontLine
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 173
    Par défaut
    Salut

    merci pour l'info pour KcacheGrind sous Gnome, je testerais ça.

    Remarque: il est possible d'exporter un noeud XMLReader en object SimpleXML
    Ah ça peut être un couple sympa ! Si je comprends bien on charge avec XMLreader pour éviter de mettre en mémoire et on traite avec simpleXML ?

    Du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $reader = new XMLReader();
     
       $reader->open( $fichier );
    Puis je manipule avec simpleXML ? Avec simplexml_load_string() par exemple ?

  13. #13
    Membre émérite

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Par défaut
    Errata, il s'agit d'exporter un noeud en noeud DOM.

    http://fr3.php.net/manual/en/xmlreader.expand.php

  14. #14
    Membre confirmé Avatar de FrontLine
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 173
    Par défaut
    Ok merci

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

Discussions similaires

  1. Réponses: 31
    Dernier message: 01/10/2009, 14h21
  2. [XML] quelle différence entre utiliser un attribut ou un tag ?
    Par clavier12AZQSWX dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 02/09/2009, 16h52
  3. Quelles classes faut-il utiliser?
    Par anaranjado dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 31/12/2008, 11h41
  4. [JAVA XML] : utilisation class générées par JAXB
    Par Michalak dans le forum Persistance des données
    Réponses: 0
    Dernier message: 31/10/2008, 15h43
  5. Interface graphique, quelles classes utiliser?
    Par miniil dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 15/02/2006, 22h38

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