Bonjour à Tous,
depuis hier, je bûche sur un script que j'ai mis au point en m'inspirant de divers sources.
L'objectif du script est de se connecter sur une bdd, collecter des données d'une table, les générer dans un fichier xml ayant la date dans le nom du fichier.

Quand je consulte le fichier xml généré sur firefox, j'ai le message suivant :

Erreur d'analyse XML : mal formé
Emplacement :  http://www.azur-mediterranee.com/img/photos/20120309-rental-azurmediterannee.xml
 
Numéro de ligne 558, Colonne 1 :
 9 master bedrooms with en-suite bathrooms
^


quand je consulte mon document, effectivement, je vois que l’erreur pointée est le premier "•" du fichier généré.

Durant la conception du fichier, j'ai rencontré le même type d'érreur avec "&", pour y remédier, j'ai ajouté la ligne de code suivante dans mon .php :
$xml = str_replace("&", "&", $xml);


là, je tente de faire la même chose avec le fameux "•" avec :
$xml = str_replace("•", "•", $xml);

ou
$xml = str_replace("�", "•", $xml);

(le "�" étant ce qui est généré sur mon xml)
(pour info, le fameux "65533" du dessus est généré par le formulaire d'Alsacréations, à la base, j'avais copié collé le logo "losange avec point d’interrogation" généré par dreamweaver)
=> sans succés

auriez vous une idée ?

merci
Modifié par Guim (09 Mar 2012 - 11:30)
Si tu as une ligne du genre :

<contenu>• fefepokfke</contenu>


remplace-la par :

<contenu><![CDATA[• fefepokfke]]></contenu>


Et vérifie bien que ton fichier xml est en utf-8.

Je pense que ça devrait rouler.
Modifié par Skoua (09 Mar 2012 - 12:19)
Je vais faire les tests,
pour info, voici mon fichier php :

<?php
    $db = mysql_connect('xxxxxx', 'xxxxxx', 'xxxxxx') OR die('Erreur de connexion à la base');  
    mysql_select_db('xxxxxx',$db) OR die('Erreur de sélection de la base');                      
    $requete = mysql_query('SELECT reference, liste_intro, liste_photo, location, property, accomodation, rel_type, lowweek, midweek, highweek, lowmonth, midmonth, highmonth, isdisplay, not_on_home, liste_intro_fr, property_fr, accomodation_fr FROM reference') OR die('Erreur de la requête MySQL 1');  
    mysql_close();  
	
    $xml = '<?xml version="1.0" encoding="utf-8"?>'.'<export>';
    while ($row = mysql_fetch_array($requete)) {
		$xml .= '<donnees>';
		$xml .= '<reference>'.$row['reference'].'</reference>';
		$xml .= '<liste_intro>'.$row['liste_intro'].'</liste_intro>';
		$xml .= '<liste_photo>'.$row['liste_photo'].'</liste_photo>';
		$xml .= '<location>'.$row['location'].'</location>';
		$xml .= '<property>'.$row['property'].'</property>';
		$xml .= '<accomodation>'.$row['accomodation'].'</accomodation>';
		$xml .= '<rel_type>'.$row['rel_type'].'</rel_type>';
		$xml .= '<lowweek>'.$row['lowweek'].'</lowweek>';
		$xml .= '<midweek>'.$row['midweek'].'</midweek>';
		$xml .= '<highweek>'.$row['highweek'].'</highweek>';
		$xml .= '<lowmonth>'.$row['lowmonth'].'</lowmonth>';
		$xml .= '<midmonth>'.$row['midmonth'].'</midmonth>';
		$xml .= '<highmonth>'.$row['highmonth'].'</highmonth>';
		$xml .= '<isdisplay>'.$row['isdisplay'].'</isdisplay>';
		$xml .= '<not_on_home>'.$row['not_on_home'].'</not_on_home>';
		$xml .= '<liste_intro_fr>'.$row['liste_intro_fr'].'</liste_intro_fr>';
		$xml .= '<property_fr>'.$row['property_fr'].'</property_fr>';
		$xml .= '<accomodation_fr>'.$row['accomodation_fr'].'</accomodation_fr>';
		$xml .= '</donnees>';
    }
    $xml .= '</export>';
	$xml = str_replace("&", "&amp;", $xml);
	
    $fp = fopen($_SERVER['DOCUMENT_ROOT']."/img/photos/".date("Ymd")."-rental-azurmediterannee.xml", 'w+');
    fputs($fp, $xml);
    fclose($fp);
?>	
heu...
quand j'écris :
$xml .= '<reference><![CDATA[''.$row['reference'].'']]></reference>';

j'ai une erreur
et quand remplace <![CDATA[' par <![CDATA[" :
$xml .= '<reference><![CDATA["'.$row['reference'].'"]]></reference>';

le résultat est le même...

peut-être que j'ai loupé quelque-chose...
Modérateur
Bonjour,

actuellement, l'erreur porte sur un "é". il ne sort pas parce qu'il est encodé en iso-8859-1, les données en bdd sont sûrement dans cet encondage. Si tu les convertis lorsque tu les acquiert, tous tes problèmes devraient se résoudre.
merci pour l'info,
y a t'il un moyen de modifier l'encodage des données déjà présentes dans la bdd ?
Étant donné que la base est déjà grande,
je n'ai d'autre choix d'exporter les données en csv.

Du coup, j'y remédie avec ce code :

<?php
	
    $db = mysql_connect('xxxx', 'xxxx', 'xxxxx') OR die('Erreur de connexion à la base');  
	mysql_select_db('xxxxx',$db) OR die('Erreur de sélection de la base');

    $fp = fopen($_SERVER['DOCUMENT_ROOT']."/img/photos/".date("Ymd")."-rental-azurmediterannee.csv", 'w+');

 	$res = mysql_query('SELECT * FROM reference AS r, photo AS p, type AS t WHERE r.id = p.id = t.id') OR die('Erreur de la requête MySQL');  

// fetch a row and write the column names out to the file
$row = mysql_fetch_assoc($res);
$line = "";
$comma = "";
foreach($row as $name => $value) {
    $line .= $comma . '"' . str_replace('"', '""', $name) . '"';
    $comma = ",";
}
$line .= "\n";
fputs($fp, $line);

// remove the result pointer back to the start
mysql_data_seek($res, 0);

// and loop through the actual data
while($row = mysql_fetch_assoc($res)) {
   
    $line = "";
    $comma = "";
    foreach($row as $value) {
        $line .= $comma . '"' . str_replace('"', '""', $value) . '"';
        $comma = ",";
    }
    $line .= "\n";
    fputs($fp, $line);
}
fclose($fp);

?>	


tout est bon sauf que le champs "photo" de la table "photo" ne me sort qu'une entrée, alors qu'il y en a plusieurs... j'ai cru comprendre qu'avec un "LEFT JOIN" je peux régler ça... je vais voir.

Du coup, mon post n'est plus vraiment à sa place...