Bonjour,

Tout d'abord je tiens a m'excuser pour l'absence d'accents dans mon texte, je vous ecris depuis un clavier qwerty. Je suis actuellement en stage aux USA et je suis confronte a un probleme que je n'arrive pas a resoudre depuis ce matin.

Je dois lire tous les fichiers XML d'un dossier et ecrire leur contenu dans une base MySQL. Tout est ok, j'ai presque fini a vrai dire.
Il ne me reste qu'un probleme : certaines valeurs (chaines) sont tronquees, c'est a dire que la partie de la chaine se trouvant juste avant une apostrophe est supprimee.

J'utilise la fonction xml_set_character_data_handler($XMLparser, "functionText"); ou functionText est la fonction appellee en callback (voir mon code ci-dessous).
Qui dit callback dit (je suppose ?) pas de variable retournee, donc je suis oblige d'utiliser des variables globales. Et a cause du switch, je ne peux pas effectuer mon traitement SQL directement dans ma fonction appellee en callback. Bref, je dois faire passer mes variables a l'exterieur de la fonction.
Sauf que j'ai ce probleme de variable tronquee avant une quote.
Quand j'echo ma variable dans la fonction, c'est ok. Par exemple :
Chef Paul Prudhomme’s Magic Seasoning Blends Inc.
Mais a l'exterieur ca donne :
’s Magic Seasoning Blends Inc.
Je suppose que le Äôs est du a l'encodage... je ne sais pas si ça peut jouer.

J'ajoute que les fichiers XML sont generes dynamiquement par un AppleScript qui les exporte depuis Adobe InDesign. Mais quand on les ouvre avec un fichier texte tout est ok niveau encodage.
A terme, les donnees sont enregistrees dans le BDD en UTF-8.

Voici une partie de mon code :
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
 
//- XML Parser functions
 
    function functionOpenTag($parser, $tagName, $Attributes)
    {
        //Just keep the tag name to use it in functionText()
        global $lastTagRead;
        $lastTagRead = $tagName;
    }
 
    function functionCloseTag($parser, $tagName)
    {
        //Forget the last tag read
        global $lastTagRead;
        $lastTagRead = "";
    }
 
    function functionText($parser, $text)
    {
        global $lastTagRead;
        switch ($lastTagRead) {
            case "TITLE": $GLOBALS['subheading'] = mysql_real_escape_string($text); break;
            case "BODY": $GLOBALS['body'] = mysql_real_escape_string($text); break;
            case "NUMBER": $GLOBALS['adid'] = (int)$text; break;
            case "COMPANY": $GLOBALS['company_name'] = mysql_real_escape_string($text); echo $GLOBALS['company_name']; break;
            case "CONTACT": $GLOBALS['contact'] = mysql_real_escape_string($text); break;
            case "ADDRESS": $GLOBALS['address'] = mysql_real_escape_string($text); break;
            case "PHONE": $GLOBALS['phone'] = mysql_real_escape_string($text); break;
            case "FAX": $GLOBALS['fax'] = mysql_real_escape_string($text); break;
            case "EMAIL": $GLOBALS['email'] = mysql_real_escape_string($text); break;
            case "URL": $GLOBALS['url'] = mysql_real_escape_string($text); break;
            case "ADSIZE": $GLOBALS['adsize'] = mysql_real_escape_string($text); break;
            case "ADTYPE": $GLOBALS['adtype'] = mysql_real_escape_string($text); break;
            case "IMG1": $GLOBALS['pic1'] = mysql_real_escape_string($text); break;
            case "IMG2": $GLOBALS['pic2'] = mysql_real_escape_string($text); break;
            case "IMG3": $GLOBALS['pic3'] = mysql_real_escape_string($text); break;
        }
	     $image = $pic1;
	     if(!isset($image) || trim($image)=="") {
		  $image = $pic2;
		  if (!isset($pic2) || trim($pic2)=="")
		       $image = $pic3;
		       if (!isset($pic3) || trim($pic3)=="")
			    $image = $pic4;
				 if (!isset($pic4) || trim($pic4)=="")
				 $image = "";
	     }      
    }
 
//-----
 
/* This is the correct way to loop over the directory. */
	    while (false !== ($file = readdir($folder))) {
	        if (substr($file, strlen($file)-4, 4) == ".xml") { //get only the xml files
 
			    $XMLparser = xml_parser_create(); // Create XML parser
			    xml_set_element_handler($XMLparser, "functionOpenTag", "functionCloseTag"); // Call these functions when an Open or Close tag is found
			    xml_set_character_data_handler($XMLparser, "functionText"); // When text is found, we call functionText()
 
etc... (ensuite c'est l'ajout dans la bdd, mais le probleme survient avant)
Merci d'avance !