Bonjour à tous,
j'aimerai à partir d'un fichier xml, lire les données afin de pouvoir les insérer dans une base mysql.
Comment m'y prendre?
J'utilise PHP en version 4.3.10.
Merci
Bonjour à tous,
j'aimerai à partir d'un fichier xml, lire les données afin de pouvoir les insérer dans une base mysql.
Comment m'y prendre?
J'utilise PHP en version 4.3.10.
Merci
Dommage. Avec php 5.0 cela aurait été du gâteau. Là il va falloir te coltiner un parser php.Envoyé par Ben42
Je dois en avoir un tout fait quelque part ça t'intéresses ?
bien sûr !!!![]()
Le parser :
L'utilisation :
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 <?php function xml2hash ( $string_to_hash , $includetoptag = false , $lowercasetags = true ) { $p = xml_parser_create() ; xml_parse_into_struct ( $p , $string_to_hash , $vals , $index ) ; xml_parser_free ( $p ) ; $xml = array() ; $levels = array() ; $multipledata = array() ; $prevtag = '' ; $currTag = '' ; $toptag = false ; foreach ( $vals as $val ) { // Open tag if ( $val['type'] == 'open' ) { if ( !xml2hashop ( $toptag , $includetoptag , $val , $lowercasetags , $levels , $prevtag , $multipledata , $xml ) ) { continue ; } } // Close tag else if ( $val['type'] == 'close' ) { if ( !xml2hashcl ( $toptag , $includetoptag , $val , $lowercasetags , $levels , $prevtag , $multipledata , $xml ) ) { continue ; } } // Data tag else if ( $val['type'] == 'complete' && isset ( $val['value'] ) ) { $loc = &$xml ; foreach ( $levels as $level ) { $temp = &$loc[str_replace ( ':arr#' , '' , $level )] ; $loc = &$temp ; } $tag = $val['tag'] ; if ( $lowercasetags ) { $tag = strtolower ( $val['tag'] ) ; } $loc[$tag] = str_replace ( '\\n' , '\n' , $val['value'] ) ; } // Tag without data else if ( $val['type'] == 'complete' ) { xml2hashop ( $toptag , $includetoptag , $val , $lowercasetags , $levels , $prevtag , $multipledata , $xml ) ; xml2hashcl ( $toptag , $includetoptag , $val , $lowercasetags , $levels , $prevtag , $multipledata , $xml ) ; } } return $xml ; } function xml2hashop ( &$toptag , &$includetoptag , &$val , &$lowercasetags , &$levels , &$prevtag , &$multipledata , &$xml ) { // don't include top tag if ( !$toptag && !$includetoptag ) { $toptag = $val['tag'] ; return false ; } $currTag = $val['tag'] ; if ( $lowercasetags ) { $currTag = strtolower ( $val['tag'] ) ; } $levels[] = $currTag ; // Multiple items w/ same name. Convert to array. if ( $prevtag === $currTag ) { if ( !array_key_exists ( $currTag , $multipledata ) || !$multipledata[$currTag]['multiple'] ) { $loc = &$xml ; foreach ( $levels as $level ) { $temp = &$loc[$level] ; $loc = &$temp ; } $loc = array ( $loc ) ; $multipledata[$currTag]['multiple'] = true ; $multipledata[$currTag]['multiple_count'] = 0 ; } $multipledata[$currTag]['popped'] = false ; $levels[] = ':arr#' . ++$multipledata[$currTag]['multiple_count'] ; } else { $multipledata[$currTag]['multiple'] = false ; } // Add attributes array if ( array_key_exists ( 'attributes' , $val ) ) { $loc = &$xml ; foreach ( $levels as $level ) { $temp = &$loc[str_replace ( ':arr#' , '' , $level )] ; $loc = &$temp ; } $keys = array_keys ( $val['attributes'] ) ; foreach ( $keys as $key ) { $tag = $key ; if ( $lowercasetags ) { $tag = strtolower ( $tag ) ; } $loc['attributes'][$tag] = &$val['attributes'][$key] ; } } return true ; } function xml2hashcl ( &$toptag , &$includetoptag , &$val , &$lowercasetags , &$levels , &$prevtag , &$multipledata , &$xml ) { // don't include top tag if ( $toptag && !$includetoptag && $val['tag'] == $toptag ) { return false ; } $prevtag = array_pop ( $levels ) ; if ( strpos ( $prevtag , 'arr#' ) ) { $prevtag = array_pop ( $levels ) ; } return true ; } ?>
$xml devient un tableau de clé/valeur et $string_xml est une chaine de caractères issue d'un fichier xml ( avec file_get_contents() par exemple ).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <?php $xml = xml2hash ( $string_xml ) ; ?>
Attention, c'est un parser codé il y a longtemps, je sais qu'il il y quelques bugs mineurs, mais c'est une base de reflexion...
merci je vais tester ça... 8)
voilà mon fichier de test :
parseur est mon fichier contenant la fonction, table.xml est le fichier à insérer dans la base. echo $xml me renvoit array... comment exploiter cet array?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <? include "parseur.php"; $string_xml= file_get_contents("table.xml"); $xml = xml2hash ( $string_xml ) ; echo $xml; ?>
Pour voir à quoi ressemble le résultat fait :
Mais entre nous il existe déjà des parseurs XML sous PHP < 5 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part <pre><?php print_r($xml) ?></pre>
Parser DOM : http://www.php.net/domxml
Parser SAX : http://www.php.net/xml
C'est parce que que tu as pas l'air d'une cloche mais sinon je t'aurais dis : joyeuse Parse...
![]()
XtofRoland, c'est recherché...
Merci Séb. Avec print r ça affiche très bien avec le parseur de macbook, maintenant comment récupérer le contenu de $xml pour les insérer dans une base...?
Code X : 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 Array ( [films] => Array ( [0] => Array ( [numfilm] => 1 [titrefilm] => Star Wars III [genrefilm] => Action [datedvd] => 2005-11-18 [descfilm] => La guerre entre les Séparatistes et la République fait rage. Anakin Skywalker (Hayden Christensen), hanté par un cauchemar récurrent dans lequel Padmé (Natalie Portman) meurt en donnant naissance à leur enfant, se laisse séduire par les discours fielleux du chancelier Palpatine. Tout en le montant contre l’ordre Jedi, celui-ci lui assure qu’il trouvera dans le côté obscur le moyen de sauver sa bien-aimée… ) [1] => Array ( [numfilm] => 2 [titrefilm] => Les Bronzés [genrefilm] => Comédie [datedvd] => 0000-00-00 [descfilm] => C’est sous une pluie torrentielle, à la nuit tombante, qu’un nouveau groupe de vacanciers débarque dans un club de vacances de Côte d’Ivoire. Animateurs sympas mais un brin cyniques, célibataires en quête d’aventures amoureuses ou couples mariés en déconfiture, ces Français moyens vont vivre une semaine de tribulations inoubliables… ) ) )
oui c'est ce que je pensais mais je vois pas trop comment l'écrire...![]()
Un peu comme cela :
Sans omettre les principe de sécurité comme les addslashes et autres...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 $sql = "INSERT INTO ma_table VALUES "; foreach ( $xml['films'] as $value ) { $sql .= " ( '" . $value['numfilm'] . "' ,'" . $value['titrefilm'] . "' ,'" . $value['genrefilm'] . "' ,'" . $value['datedvd'] . "' ,'" . $value['descfilm'] . "' ) , " ; } $sql = substr ( $sql , 0 , - 3 ) ;
merci beaucoup !
Partager