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 : 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
$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;
}