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 11/07/2006, 17h06   #1
Futur Membre du Club
 
Inscription : juillet 2004
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 58
Points : 17
Points : 17
Par défaut [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 :
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 :
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
seb92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2006, 17h28   #2
Membre éclairé
 
Avatar de DBProg
 
Étudiant
Inscription : juillet 2006
Messages : 242
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 242
Points : 315
Points : 315
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.
DBProg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2006, 17h51   #3
Futur Membre du Club
 
Inscription : juillet 2004
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 58
Points : 17
Points : 17
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
seb92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 23h05   #4
Candidat au titre de Membre du Club
 
Inscription : août 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 26
Points : 14
Points : 14
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 :
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
nycolas est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h45.


 
 
 
 
Partenaires

Hébergement Web