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 14/04/2007, 17h01   #1
Invité de passage
 
Inscription : juillet 2006
Messages : 18
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 18
Points : 4
Points : 4
Par défaut [EXPAT] je galère

j'ai un gros fichier XML (10Mo) à entrer dans une abse MySQL.
j'ai reussi à bien avancé mais je me retrouve avec des problèmes qui me coincent.
la structure est la suivante (avec la profondeur) :
<Base> 1
<Table> 2
<Ligne> 3
<champs> 4
je récupère chaque ligne en faisant un tableau associatif des champs et je l'insère dans la table MySQL correspondante.
(pour l'instant j'écris le résultat en HTML pour tester, sans enregistrer dans la table)

mon premier problème est que si j'ai un champs vide, mon script m'envoie la valeur du champs précédent !

voici le code :

Code php :
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
$file = 'data.xml';
$depth = 0; //array() variable de la profondeur de l'arbre
$globaldata =""; // Valeur du dernier élément lu
$table = "";
$tab_tables['TABLEDEPARTEMENT'] = 'departement';
$tab_tables['TABLEPAYS'] = 'pays';
$tab_tables['TABLEREGION'] = 'regions';
$tab_tables['TABLEADRESSE'] = 'adresses';
$tab_tables['TABLEDEPTVOISIN'] = 'dptvoisins';
$tab_tables['TABLELOCALITE'] = 'localites';
$tab_tables['TABLETYPE'] = 'type';
 
// Fonction associée à l’événement début d’élément
function startElement($parser, $name, $attrs) {
	global $depth, $tab_tables, $table;
	$depth++;
	if ($depth == 2) $table = $tab_tables[$name];
	echo "<BR>$depth, $name, $table";
}
 
// Fonction associée à l’événement données textuelles
function characterData($parser, $data){
	global $globaldata;
	$globaldata = $data;
}
 
// Fonction associée à l’événement fin d’élément
function endElement($parser, $name){
	global $depth, $globaldata, $table, $tab_ligne;
	if ($depth == 4) $tab_ligne[$name] = $globaldata;
	elseif ($depth == 3){
		txt2bd($table, $tab_ligne);
		unset($tab_ligne);
	}
	$depth--;
}
 
// ecrire le contenu de la ligne XML passé au tablo PHP
function txt2bd($t, $data){
	echo "<BR><B>$t</B> :";
	foreach ($data as $k => $v) echo "$k=<I>$v</I>| ";
}
 
// Fonction associée à l’événement de détection d'un appel d'entité externe
function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId, $publicId){
	if ($systemId){
		if (!list($parser, $fp) = new_xml_parser($systemId)){
			printf("Impossible d'ouvrir %s à %s\n", $openEntityNames, $systemId);
			return FALSE;
		}
		while ($data = fread($fp, 4096)){
			if (!xml_parse($parser, $data, feof($fp))) {
				printf("Erreur XML : %s à la ligne %d lors du traitement de l'entité %s\n",
				   xml_error_string(xml_get_error_code($parser)),
				   xml_get_current_line_number($parser),
				   $openEntityNames);
				xml_parser_free($parser);
			return FALSE;
			}
		}
		xml_parser_free($parser);
		return TRUE; 
	}
return FALSE;
}
 
// Fonction de création du parser et d'affectation des fonctions aux gestionnaires d'événements
function new_xml_parser($file){
	global $parser_file;
	//création du parseur
	$xml_parser = xml_parser_create();
	xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1);
	xml_set_element_handler($xml_parser, "startElement", "endElement");
	xml_set_character_data_handler($xml_parser, "characterData");
	xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler");
	//Ouverture du fichier
	if (!($fp = @fopen($file, "r"))) { return FALSE; }
	//Transformation du parseur en un tableau
	if (!is_array($parser_file)){ settype($parser_file, "array"); }
	$parser_file[$xml_parser] = $file;
	return array($xml_parser, $fp);
}
 
// Appel à la fonction de création et d'initialisation du parseur
if (!(list($xml_parser, $fp) = new_xml_parser($file))){ die("Impossible d'ouvrir le document XML"); }
$i = 1;
while ($data = fread($fp, 4096)){
	if (!xml_parse($xml_parser, $data, feof($fp))) {
		die(sprintf("Erreur XML : %s à la ligne %d\n",
			  xml_error_string(xml_get_error_code($xml_parser)),
			  xml_get_current_line_number($xml_parser)));
   }
   $i++;
   if ($i == 50) exit;
}
pierrickg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2007, 19h18   #2
Invité de passage
 
Inscription : juillet 2006
Messages : 18
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 18
Points : 4
Points : 4
Par défaut ah! voilà.

en mettant mes chaussettes ce matin, l'idée m'est venue !

je croyais que xml_set_character_data_handler($xml_parser, "characterData");
enverrai quelque chose (une valeur vide) pour le data vide d'une balise vide (si vous me suivez) : <balise></balise>

eh bien non !
ma variable $globaldata n'était donc pas remplacée par "" dans la fonction characterData, celle-ci n'étant pas appelée !
je la réinitialise donc dans la fonction startElement et le tour est joué.
pierrickg 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 02h37.


 
 
 
 
Partenaires

Hébergement Web