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] parser un xml


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 58
    Points : 44
    Points
    44
    Par défaut [XML] [EXPAT] parser un xml
    Bonjour,

    J'ai un script qui fonctionnait bien en PHP4.
    Je viens de passer en PHP5 et rien ne va plus !

    c'est simplement un script qui parse un fichier xml
    et remonte les infos lues en base.
    le fichier xml est simple :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="ISO-8859-1" ?> 
     <racine>
      <MODEREG>
      <code-reg>B30FM05</code-reg> 
      <libelle>Billet à ordre à 30 jours le 5</libelle> 
      </MODEREG>
      <MODEREG>
      <code-reg>B90J</code-reg> 
      <libelle>Billet à ordre à 90 jours</libelle> 
      </MODEREG>
      <MODEREG>
      <code-reg>B90LE10</code-reg> 
      <libelle>Billet à 90j fin mois le 10</libelle> 
      </MODEREG>
     </racine>


    Depuis que je suis passée en PHP5, les libellés que je récupère sont tronqués.
    Par exemple pour : <libelle>Billet à ordre à 30 jours le 5</libelle>
    Je ne récupère que : à ordre à 30 jours le 5
    C'est à dire que tout ce qui est avant le 1er caractère accentué est tronqué.

    Le script qui parse :

    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
    //function appelé au début de chaque balise du fichier XML
    function gestionnaire_debut($analyseur, $nom, $attribut){
    	global $cont;
    	global $nb; 
    	$balise=$nom;   
    	$nb++;
    }
     
    //function appelé à la fin de chaque balise du fichier XML
    function gestionnaire_fin($analyseur, $nom){
    	if($nom=="MODEREG")
    		insert_base();
    	global $balise;
    	$balise=$nom;
    	global $nb;
    	$nb--;
    }
     
    //function appelé lorsque des DATA sont trouvés
    function gestionnaire_texte($analyseur, $texte){
    	global $texteavant;	
    	global $balise;
    	global $nb;
    	global $codetypeannexe,$typeannexe;
    	switch ($balise) { 
    	    case "CODE-REG":
    		$codetypeannexe=$texteavant;
    		break;
    	    case "LIBELLE":
    		$typeannexe=$texteavant;
    		break;
    	}
    	$balise="";
    	$texteavant = $texte;
    }
     
    //insertion dans la base quand datas trouvées
    function insert_base(){
    	global $codeclient;
    	global $codeadresse;
    	global $balise;
    	global $codetypeannexe,$typeannexe;
    	global $table;
    	$typeannexe=eregi_replace("'","''",$typeannexe);
    	$req = "INSERT INTO $table (CODE_MODE_REGLEMENT , MODE_REGLEMENT) VALUES ('$codetypeannexe','$typeannexe')";
    	$ajout=mssql_query("$req"); 
    	if (!$ajout) {echo "$req <br><br>";}
    	$cont++;
    }
     
    $analyseur_xml = xml_parser_create("ISO-8859-1");
     
    xml_set_element_handler($analyseur_xml, "gestionnaire_debut", "gestionnaire_fin");
    xml_set_character_data_handler($analyseur_xml, "gestionnaire_texte");
     
    if (!($id_fichier = fopen($fichier, "r"))){ die("Impossible d'ouvrir le fichier XML !"); }
    while ($donnee = fread($id_fichier, filesize($fichier))) { //echo $donnee."<br>";
     
    	if (!xml_parse($analyseur_xml, $donnee, feof($id_fichier))) {
    			die(sprintf("Une erreur XML %s s'est produite "
                            . "à la ligne %d et à la colonne %d.",
                        xml_error_string(xml_get_error_code($analyseur_xml)),
                        xml_get_current_line_number($analyseur_xml),
                        xml_get_current_column_number($analyseur_xml)));
    	}
    }
     
    xml_parser_free($analyseur_xml);

    C'est vrai que je ne comprends pas grand chose aux parseurs (!) mais je cherche depuis un moment à comprendre et je ne trouve pas. J'ai lu que c'était en effet un problème qui est dû au passage à PHP5, mais je ne comprends pas comment résoudre.

    Est-ce que je dois utiliser d'autres fonctions ?
    J'ai trouvé des exemples avec DOM mais je ne comprends pas ces exemples, ça ne semble jamais correspondre (ni de près, ni de loin) à mon cas de figure !!
    Je ne sais même plus par où je dois commencer pour résoudre mon souci !

    Est-ce que quelqu'un peut m'orienter ??

    merci d'avance

  2. #2
    Membre confirmé
    Avatar de DBProg
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 579
    Points
    579
    Par défaut
    Salut !

    Dans ton cas l'utilisation de SimpleXML semblerait convenir non ? Est-ce que tu as regardé du côté de SimpleXML ?

    http://fr2.php.net/manual/fr/ref.simplexml.php

    Sinon avec xml_parser il faut peut-être modifier les options d'encodage pour qu cela fonctionne. Tu peux le faire avec xml_set_parser_option.

    Il y a en particulier une option : XML_OPTION_TARGET_ENCODING qui pourrait peut-être résoudre le problème.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    oui j'ai essayé cette syntaxe :

    $analyseur_xml = xml_parser_create("");
    xml_parser_set_option($analyseur_xml, XML_OPTION_TARGET_ENCODING, "ISO-8859-1");

    au lieu de :

    $analyseur_xml = xml_parser_create("ISO-8859-1");


    mais ça ne change rien.
    La partie avant le 1er accentué est toujours tronqué.
    je vais suivre ton lien mais je crois y être déjà allé tt à l'heure

  4. #4
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 33
    Points : 47
    Points
    47
    Par défaut
    Je réponds bien que cela fasse très longtemps que le message ait été posté, mais je viens de passer du temps sur ce problème d'accents avec le XML en PHP5 alors que ça marchait bien en PHP4... la solution aidera peut-être quelqu'un qui tombera sur topic...

    Tu déclares ce gestionnaire :
    xml_set_character_data_handler($analyseur_xml, "gestionnaire_texte");

    Le problème vient que ta fonction "gestionnaire_texte" est appelée plusieurs fois pour différentes parties d'une même donnée, depuis PHP5, et ce n'était pas le cas en PHP4.

    Les appels du parser se passent ainsi :

    gestionnaire_debut
    gestionnaire_texte
    ...
    gestionnaire_texte
    gestionnaire_fin

    donc il faut cumuler les valeurs fournies à "gestionnaire_texte" pour avoir la valeur complète... Dans l'exemple donné, que je reproduis ci-dessous, il faudrait faire quelque chose du genre :

    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
    //function appelé lorsque des DATA sont trouvés
    function gestionnaire_texte($analyseur, $texte){
    	global $texteavant;	
    	global $balise;
    	global $nb;
    	global $codetypeannexe,$typeannexe;
    	switch ($balise) { 
    	    case "CODE-REG":
    		$codetypeannexe.=$texteavant; // <- Ajout du point
    		break;
    	    case "LIBELLE":
    		$typeannexe.=$texteavant; // <- Ajout du point
    		break;
    	}
    	// $balise=""; // <- A ne plus faire maintenant
    	$texteavant = $texte;
    }
    Voilà, j'espère que ça aura pu aider quelqu'un... Bon dév à tous !

    Nyco

Discussions similaires

  1. [XML] [EXPAT] Parser un document pour ajout MySQL
    Par mickael.be dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 21/10/2006, 20h08
  2. [XML] [EXPAT] Parser un fichier xml avec php
    Par Dargos dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 05/04/2006, 12h25
  3. [XML] [EXPAT] parser sous forme de classe
    Par gorgonite dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 09/03/2006, 20h49
  4. [XML] [EXPAT] Parser fichier XML
    Par Ben42 dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 17/02/2006, 14h08
  5. [XML] [EXPAT] Parser XML avec PHP
    Par glsn dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 20/12/2005, 12h29

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