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 17/02/2006, 09h11   #1
Membre habitué
 
Inscription : novembre 2005
Messages : 189
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 189
Points : 145
Points : 145
Par défaut [EXPAT] Parser fichier XML

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
Ben42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2006, 09h28   #2
Membre émérite
 
Avatar de macbook
 
Inscription : février 2006
Messages : 840
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 840
Points : 924
Points : 924
Par défaut Re: Parser fichier XML

Citation:
Envoyé par Ben42
J'utilise PHP en version 4.3.10.
Dommage. Avec php 5.0 cela aurait été du gâteau. Là il va falloir te coltiner un parser php.

Je dois en avoir un tout fait quelque part ça t'intéresses ?
macbook est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2006, 09h28   #3
Membre habitué
 
Inscription : novembre 2005
Messages : 189
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 189
Points : 145
Points : 145
bien sûr !!!
Ben42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2006, 10h31   #4
Membre émérite
 
Avatar de macbook
 
Inscription : février 2006
Messages : 840
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 840
Points : 924
Points : 924
Le parser :

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
 
<?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 ; 
	}
?>
L'utilisation :

Code :
1
2
3
4
 
<?php
$xml = xml2hash ( $string_xml ) ; 
?>
$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 ).

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...
macbook est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2006, 10h32   #5
Membre habitué
 
Inscription : novembre 2005
Messages : 189
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 189
Points : 145
Points : 145
merci je vais tester ça... 8)
Ben42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2006, 10h41   #6
Membre habitué
 
Inscription : novembre 2005
Messages : 189
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 189
Points : 145
Points : 145
voilà mon fichier de test :
Code :
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;
?>
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?
Ben42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2006, 11h40   #7
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 819
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 819
Points : 3 445
Points : 3 445
Pour voir à quoi ressemble le résultat fait :

Code :
<pre><?php print_r($xml) ?></pre>
Mais entre nous il existe déjà des parseurs XML sous PHP < 5 :
Parser DOM : http://www.php.net/domxml
Parser SAX : http://www.php.net/xml
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2006, 11h50   #8
Membre éclairé
 
Avatar de XtofRoland
 
Inscription : août 2005
Messages : 361
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 361
Points : 340
Points : 340
C'est parce que que tu as pas l'air d'une cloche mais sinon je t'aurais dis : joyeuse Parse...
__________________
Le but de tout developpeur OO est de devenir une référence.
Mon avatar est un ambigramme, les curieux peuvent le retourner ;-)
Aider <> Faire a la place de!!!
XtofRoland est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2006, 11h59   #9
Membre habitué
 
Inscription : novembre 2005
Messages : 189
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 189
Points : 145
Points : 145
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 :
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…

                )

        )

)
Ben42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2006, 12h07   #10
Membre émérite
 
Avatar de macbook
 
Inscription : février 2006
Messages : 840
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 840
Points : 924
Points : 924
Avec un foreach ???
macbook est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2006, 12h15   #11
Membre habitué
 
Inscription : novembre 2005
Messages : 189
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 189
Points : 145
Points : 145
oui c'est ce que je pensais mais je vois pas trop comment l'écrire...
Ben42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2006, 12h44   #12
Membre émérite
 
Avatar de macbook
 
Inscription : février 2006
Messages : 840
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 840
Points : 924
Points : 924
Un peu comme cela :

Code :
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 ) ;
Sans omettre les principe de sécurité comme les addslashes et autres...
macbook est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2006, 14h08   #13
Membre habitué
 
Inscription : novembre 2005
Messages : 189
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 189
Points : 145
Points : 145
merci beaucoup !
Ben42 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 01h05.


 
 
 
 
Partenaires

Hébergement Web