IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[XML] [EXPAT] je galère


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 18
    Par défaut [XML] [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 : 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;
    }

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 18
    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é.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XML] [EXPAT] Problème parser XML EXPAT
    Par zan001 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 19/04/2007, 09h48
  2. [C][XML][Expat][XPATH] une Lib au dessus d'expat ?
    Par chronos dans le forum Bibliothèques
    Réponses: 8
    Dernier message: 08/02/2007, 09h50
  3. [XML] [EXPAT] Problème avec Parseur XML
    Par tubeless dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 09/02/2006, 09h52
  4. [XML] [EXPAT] Parser XML avec PHP
    Par glsn dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 20/12/2005, 12h29
  5. [XML] [EXPAT] D'un document Xml vers une base de données
    Par AlphonseBrown dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 07/12/2005, 12h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo