Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML
XML Forum d'entraide sur XML avec PHP. Exemples : SimpleXML, OpenXML... Avant de poster -> FAQ XML, Cours XML et Sources XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/10/2007, 15h40   #1
Membre du Club
 
Inscription : avril 2007
Messages : 233
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : avril 2007
Messages : 233
Points : 60
Points : 60
Par défaut [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 :

Citation:
<?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
__________________
Il faut parfois servir pour mieux dériger..
namstou3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2007, 19h49   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
A la rache :
Code :
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.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2007, 20h06   #3
Membre du Club
 
Inscription : avril 2007
Messages : 233
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : avril 2007
Messages : 233
Points : 60
Points : 60
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 :
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();
?>
__________________
Il faut parfois servir pour mieux dériger..
namstou3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h45.


 
 
 
 
Partenaires

Hébergement Web