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 :

[XML] [SAX] parser un fichier XML


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2007
    Messages : 233
    Points : 94
    Points
    94
    Par défaut [XML] [SAX] parser un fichier XML
    Autrement dit;

    Je veux créer une fonction pour parser mon fichier XML de telle sorte que si je donne comme attribut (id dans l'exemple) '4' comme valeur et je donne le nom de la balise (dans l'exemple) 'date'; ça devrai me retourner comme résultat 20/01/2007. c'est à dire que ma fonction contiendra 2 paramètres.

    mon fichier XML est :

    <?xml version="1.0" encoding="iso-8859-1"?>
    <opcvm_all>
    <opcvm id="4">
    <date>20/01/2007</date>
    <vl>0000</vl>
    <trois_ans>2007</trois_ans>
    <un_an>2007</un_an>
    <six_mois>2007</six_mois>
    </opcvm>
    <opcvm id="3">
    <date>20/01/2007</date>
    <vl>1111</vl>
    <trois_ans>0000</trois_ans>
    <un_an>0000</un_an>
    <six_mois>0000</six_mois>
    </opcvm>
    </opcvm_all>
    Merci de m'aider là dessus

  2. #2
    Expert éminent sénior

    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
    Points : 17 777
    Points
    17 777
    Par défaut
    A la rache :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    <?php
    $fichier = 'opcvm_all.xml';
     
    class OPCVMArrayParser
    {
        /* protected */ var $_parser;
        /* protected */ var $_array = array();
        /* protected */ var $_curId = -1;
        /* protected */ var $_lastTag;
     
        /* public */ function getArrayFromXML()
        {
            return $this->_array;
        }
     
        /* private */ function _init()
        {
            $this->_parser = xml_parser_create();
            xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, 0);
            xml_parser_set_option($this->_parser, XML_OPTION_SKIP_WHITE, 1);
            xml_set_object($this->_parser, $this);
            xml_set_element_handler($this->_parser, array(&$this, '_startElement'), array(&$this, '_endElement'));
            xml_set_character_data_handler($this->_parser, array(&$this, '_characterData'));
        }
     
        /* private */ function _parse($data, $is_final = TRUE)
        {
            $ret = xml_parse($this->_parser, $data, $is_final);
            if (!$ret) {
                die(xml_error_string(xml_get_error_code($this->_parser)));
            }
        }
     
        /* public */ function parseFile($fichier)
        {
            if (is_file($fichier)) {
                $fp = fopen($fichier, 'r');
                $this->_init();
                while ($data = fread($fp, 4096)) {
                    $this->_parse($data, feof($fp));
                }
                fclose($fp);
            } else {
                die("Erreur : '$fichier' est inexistant ou n'est pas un fichier régulier");
            }
        }
     
        /* public */ function parseString($string)
        {
            $this->_init();
            $this->_parse($string);
        }
     
        /* protected */ function _startElement($parser, $name, $attrs)
        {
            if ($name == 'opcvm' && isset($attrs['id'])) {
                $this->_curId = $attrs['id'];
                $this->_array[$this->_curId] = array();
            } else {
                $this->_lastTag = $name;
            }
        }
     
        /* protected */ function _endElement($parser, $name)
        {
            if ($name == 'opcvm') {
                $this->_curId = -1;
            }
        }
     
        /* protected */ function _characterData($parser, $data)
        {
            if ($this->_curId != -1) {
                if (!isset($this->_array[$this->_curId][$this->_lastTag])) {
                    $this->_array[$this->_curId][$this->_lastTag] = $data;
                } else {
                    $this->_array[$this->_curId][$this->_lastTag] .= $data;
                }
            }
        }
     
        /* public */ function __destruct()
        {
            xml_parser_free($this->_parser);
            unset($this->_array);
        }
    }
     
    $p =& new OPCVMArrayParser();
    $p->parseFile($fichier);
    $tab = $p->getArrayFromXML();
    echo '<pre>' . print_r($tab, TRUE) . '</pre>';
     
    var_dump(trim($tab[4]['date']));
     
    $p->__destruct();
    J'insiste sur le fait qu'il y a des extensions qui font un travail plus ou moins similaire :
    • PHP 5 : DOM combiné à XPath par exemple et SimpleXML
    • PHP 4 : DOMXML lié à XPath


    PS : a priori, l'option XML_OPTION_SKIP_WHITE n'a aucun effet et le seul moyen de se débarrasser des espaces superflus facilement serait d'allier array_map et trim en une fonction (ou méthode) récursive sur le tableau obtenu.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2007
    Messages : 233
    Points : 94
    Points
    94
    Par défaut
    Merci julp pour ta réponse au fait j'ai réglé mon problème à partir de la discussion suivante: http://www.developpez.net/forums/sho...9&postcount=20

    sinon voici mon code ça pourrai peut être vous être 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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
     
    <?php
    //Debut class tag
    class tag
    {	var $tag_array;
        var $name;
        var $data;
        var $parentTag;
        var $attr_array;
     
        /*** Constructeur de la classe tag */
        function tag()
        {	$this->tag_array = array();
            $this->data = "";
            $this->name = "";
            $this->parentTag = NULL;
        }
     
        /*** Recherche la liste des balises (objets tag) contenus dans la balise désignée par le paramètre $name
        * @param $name Nom de la balise recherchée
        * @return Un tableau d'objets de type tag contenant la liste des balises parentes à la balise $name
        */
        function getElementsByTagName($name)
        {	$tag_list = new tag();
            foreach ($this->tag_array as $tag)
            {	if($tag->name == $name)
                {	array_push($tag_list->tag_array, $tag);
                }
            }
            return $tag_list;
        }
     
        /*** Récupère le texte contenu entre les balises en désignant la balises concernée par son index dans un tableau d'objets tag renvoyé par 
    
    	getElementsByTagName
        * @index $index index de l'élément du tableau
        * @return Un tableau d'objets de type tag contenant la liste des balises parentes à la balise $name
        */
        function getDataItem($index)
        {	return $this->tag_array[$index]->data;
        }
     
        /*** Retourne le nombre de balises filles de la balise actuelle
        * @return le nombre de balises filles de la balise actuelle
        */
        function getSize()
        {	return count($this->tag_array);
        }
    }//Fin class tag
     
     
    //Debut class XML_Parser
    class XML_Parser
    {
        var $xml_parser;
        var $xml_file;
        var $root;
        var $parentTag;
        var $currentTag;
     
        /*** retourne un objet tag correspondant à la racine du document XML
        * @return un objet tag correspondant à la racine du document XML
        */
        function documentElement()
        {
            return $this->root->tag_array[0];
        }
     
        /*** constructeur de la classe XML_Parser */
        function XML_Parser()
        {
            $this->xml_parser = xml_parser_create();
            xml_set_object($this->xml_parser, $this);
            xml_set_element_handler($this->xml_parser, "startTag", "endTag");
            xml_set_character_data_handler($this->xml_parser, "characterData");            
     
            $this->xml_file = "";
            $this->root = new tag();
            $this->parentTag = &$this->root;
            $this->currentTag = NULL;
            }
     
        /*** Destructeur de la classe XML_Parser (à appeler explicitement car PHP 4 ne gère par les destructeurs de classe) */
        function destroy()
        {
            xml_parser_free($this->xml_parser);
        }
     
        /*** Fonction Callback appelée par le parseur XML EXPAT lors de l'ouverture d'une balise dans le fichier XML
        * @param $parser Parseur XML
        * @param $name Nom de la balise parsée
        * @param $attrs Attributs éventuels de la balise parsée
        */
        function startTag($parser, $name, $attrs)
        {
            array_push($this->parentTag->tag_array, new tag());
            $indice = count($this->parentTag->tag_array)-1;
            $this->parentTag->tag_array[$indice]->name = $name;
            $this->parentTag->tag_array[$indice]->parentTag = &$this->parentTag;
            $attrs?$this->parentTag->tag_array[$indice]->attr_array = $attrs:0;
            $this->parentTag = &$this->parentTag->tag_array[$indice];
            $this->currentTag = &$this->parentTag;
     
        }
     
        /*** Fonction Callback appelée par le parseur XML EXPAT lors de la fermeture d'une balise dans le fichier XML
        * @param $parser Parseur XML
        * @param $name Nom de la balise parsée
        */
        function endTag($parser, $name)
        {
            $this->parentTag = &$this->parentTag->parentTag;
        }
     
        /*** Fonction Callback appelée par le parseur XML EXPAT lors de la rencontre de texte ne correspondant par à une balise
        * @param $parser Parseur XML
        * @param $data Texte lu
        */
        function characterData($parser, $data)
        {
            $this->currentTag->data .= $data;
        }
     
        /*** Charge le fichier XML $xml_file et complète $root */
        function load()
        {
                if (!($fp = fopen($this->xml_file, "r")))
            {
                        die("could not open XML input");
                }
     
            while ($data = fread($fp, 4096))
            {
                if (!xml_parse($this->xml_parser, $data, feof($fp)))
                {
                    die(sprintf("XML error: %s at line %d",
                        xml_error_string(xml_get_error_code($this->xml_parser)),
                        xml_get_current_line_number($this->xml_parser)));
                }
            }
     
     
        }
     
    }//Fin class XML_Parser
     
     
    $parser = new XML_Parser();
    $parser->xml_file = "apcvm_all.xml";
    $parser->load();
    $racine = $parser->documentElement();
    $livres = $racine->getElementsByTagName('OPCVM');
     
    foreach($livres->tag_array as $opcvm)
    {
        $id = $opcvm->attr_array['ID'];
    	$tabDataXML[$id]["date"]=$opcvm->getDataItem(0);
    	$tabDataXML[$id]["vl"]=$opcvm->getDataItem(1);
    	$tabDataXML[$id]["trois_ans"]=$opcvm->getDataItem(2);
    	$tabDataXML[$id]["un_an"]=$opcvm->getDataItem(3);
    	$tabDataXML[$id]["six_mois"]=$opcvm->getDataItem(4);
    }
    print_r($tabDataXML);
    $parser->destroy();
    ?>

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

Discussions similaires

  1. Parser un fichier XML avec SAX en java
    Par LamDouni dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 23/12/2015, 13h50
  2. parser un fichier xml avec xml.sax
    Par pi-2r dans le forum Général Python
    Réponses: 2
    Dernier message: 07/08/2014, 16h06
  3. parser un fichier xml avec xml.sax et la méthode "feed"
    Par louisonb dans le forum Général Python
    Réponses: 1
    Dernier message: 06/04/2009, 11h41
  4. [SAX] parser un fichier xml en Java
    Par royou dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/02/2005, 17h12
  5. parser des fichier .xml en perl
    Par djibril dans le forum Modules
    Réponses: 13
    Dernier message: 18/05/2004, 17h08

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