Rechercher : dans
Par :

Pb accents - parser xml avec php

Dernière réponse le 6 mar 2009 à 00:52:35 remoh, le 14 déc 2007 à 12:20:18 
 Signaler ce message aux modérateurs

Bonjour,

Je récupère un flux xml et j'affiche les infos qui m'interesse avec le parser de php. Le but est d'inserer ces infos dans une bdd mysql ensuite...
J'ai un problème dès qu'il y a des accents dans les donées xml...
Mon flux est encodé en utf-8, je conserve cet encodage dans mon fichier php, mais dès que le parser croise un caractere accentué, il coupe la chaine et n'affiche que les lettres qui suivent l'accent ???

J'ai fais des recherche un peu partout et je n'ai pas trouvé de discussion à ce sujet...
Merci de votre aide.

Voila mon parser :

<?php
header('Content-Type: text/xml; charset=utf-8');
$fichier = "http://www...";

// Ma propre fonction de traitement des balises ouvrantes
function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
{
// En fait... nous nous conteterons de mémoriser le nom de la balise
// afin d'en tenir compte dans la fonction "fonctionTexte"

global $derniereBaliseRencontree;

$derniereBaliseRencontree = $nomBalise;
}

// Ma propre fonction de traitement des balises fermantes
function fonctionBaliseFermante($parseur, $nomBalise)
{
global $derniereBaliseRencontree;
global $nom_salle;
global $ville;
global $nom_manif;
global $genre;
global $url;
global $date_debut;
global $date_fin;

switch ($nomBalise) {
case "MANIF" :
// nous quittons un bloc item
// nous pouvons afficher le titre de l'article
echo "$nom_salle<br />";
echo "$ville<br />";
echo "$nom_manif<br />";
echo "$genre<br />";
echo "$url<br />";
echo "$date_debut<br />";
echo "$date_fin<br /><br /><br />";
}

// On oublie la dernière balise rencontrée
// et tout le reste
$derniereBaliseRencontree = "";
}

// Ma propre fonction de traitement du texte
// qui est appelée par le "parseur"
function fonctionTexte($parseur, $texte)
{
global $derniereBaliseRencontree;
global $nom_salle;
global $ville;
global $nom_manif;
global $genre;
global $url;
global $date_debut;
global $date_fin;

// Nous n'affichons pas le texte ou lien directement
// nous attendrons de rencontrer la balise fermante
// et ainsi d'avoir tous les élements avant l'affichage.
// ATTENTION: Par défaut les noms des balises sont
// mises en majuscules

switch ($derniereBaliseRencontree) {
case "NOM_SALLE":
$nom_salle = $texte;
break;
case "VILLE":
$ville = $texte;
break;
case "NOM_MANIF":
$nom_manif = $texte;
break;
case "GENRE":
$genre = $texte;
break;
case "URL":
$url = $texte;
break;
case "DATE_DEBUT":
$date_debut = $texte;
break;
case "DATE_FIN":
$date_fin = $texte;
break;
}
}

// Création du parseur XML
$parseurXML = xml_parser_create();

// Je précise le nom des fonctions à appeler
// lorsque des balises ouvrantes ou fermantes sont rencontrées
xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante"
, "fonctionBaliseFermante");

// Je précise le nom de la fonction à appeler
// lorsque du texte est rencontré
xml_set_character_data_handler($parseurXML, "fonctionTexte");

// Ouverture du fichier
$fp = fopen($fichier, "r");
if (!$fp) die("Impossible d'ouvrir le fichier XML");

// Lecture ligne par ligne
while ( $ligneXML = fgets($fp, 1024)) {
// Analyse de la ligne
// REM: feof($fp) retourne TRUE s'il s'agit de la dernière
// ligne du fichier.
xml_parse($parseurXML, $ligneXML, feof($fp)) or
die("Erreur XML");
}

xml_parser_free($parseurXML);
fclose($fp);
?>

Configuration: Windows XP
Internet Explorer 7.0

Meilleures réponses pour « Pb accents parser xml avec php » dans :
PHP - Parser du XML Voir Introduction à XML PHP permet l'analyse syntaxique (parsage ou parsing en anglais) d'un document XML. Le langage XML (eXtensible Markup Language, traduisez Langage à balises extensibles) est un métalangage, c'est-à-dire un langage permettant de...
[PHP] Parse error, unexpected T_STRING, expecting ',' or ';' VoirCette erreur, fréquente, se produit notamment lorsqu'un guillemet est présent dans une chaîne délimitée par ce même type de guillemets, par exemple :
Télécharger Notepad2 VoirNotepad2 est un bloc-note sans installation libre possédant des fonctionnalités avancées de coloration syntaxique. Fonctionnalités Coloration syntaxique pour les langages suivants : HTML, XML, PHP, ASP (JScript, VBS), CSS, JavaScript, VBScript,...
DOM (Document Object Model) et SAX (Simple API for XML) VoirXML permet de définir la structure du document uniquement, ce qui permet d'une part de pouvoir définir séparément la présentation de ce document, d'autre part d'être capable de récupérer les données présentes dans le document pour les...
Introduction à XML VoirPrésentation de XML XML (entendez eXtensible Markup Language et traduisez Langage à balises étendu, ou Langage à balises extensible) est en quelque sorte un langage HTML amélioré permettant de définir de nouvelles balises. Il s'agit effectivement...
Importer et exporter des données sous MySQL VoirImportation et exportation Les Système de Gestion de Bases de Données tels que MySQL permettent de manipuler facilement et avec beaucoup de souplesse un très important volume de données. Toutefois, aussi robuste soit MySQL, il peut être intéressant...

1

remoh, le 14 déc 2007 à 13:21:53

Voila un extrait du résultat généré par me parser php :

THEATRE DE L'OEUVRE
PARIS
L'ENTRETIEN DE M. DESCARTES
éâtre contemporain // Au lieu de Théâtre ???
http://www.carrefourspectacles.com/goManifestation.do?codman­=DESCA
10/10/2007
31/12/2007


OPERA MUNICIPAL
MARSEILLE
MOZART - SCHUMANN - BEETHOVEN
éra // Au lieu de Classique - Lyrique - Opéra ???
http://www.carrefourspectacles.com/goManifestation.do?codman­=CON29
29/03/2008
29/03/2008

Merci de votre aide

Répondre à remoh

2

Ildwen, le 27 déc 2007 à 16:48:21

Bonjour,

J'ai exactement le même problème.
Sous php4 tout fonctionnait parfaitement. Mais j'ai voulu passer mon application sous php5 et là ca ne fonctionne plus. Toutes les lettres avant les accents disparaissent. Quelqu'un a-t-il une idée?

D'avance merci

Répondre à Ildwen

3

yorshinnh, le 18 mar 2008 à 11:26:50

Salut à tous, j'ai exactement le même problème.
J'ai tenté avec la bibliothèque PEAR XML_Parser, aucune différence.
J'ai tenté ensuite avec la fonction Simple_XML intégrée dans PHP5 mais ça m'oblige à recoder toutes les classes....la misère, si quelqu'un a une solution, je suis preneur...
Merci

Répondre à yorshinnh

4

tungsten, le 21 avr 2008 à 16:28:45

Bonjour,

j'utilise des fichier xml tels que :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rss>
<channel>
<item id="1">
<title>Produits de la mer</title>
<pubDate>Wed, 31 Oct 2007 11:01:47 GMT</pubDate>
<image>image/products/1.jpg</image>
<description><![CDATA[<span class='product'>Ceci est un test ! Je préfère cela et il n'est pas prêt à nous le dire...</span>]]></description>

</item>


</channel>
</rss>

que ce soit en UTF-8 ou pas, c'est pareil !

les accents s'affichent mal ou pas du tout !
Que faire je sèche...?

Répondre à tungsten

5

Bussy14, le 30 mai 2008 à 18:06:27
  • +1

Bonjour à tous!

Après quelques recherches, j'ai trouvé par hasard une solution dans les commentaires de la page qui décrit la fonction php utf8_encode():
http://ca3.php.net/manual/en/function.utf8-encode.php#23926

Il s'agit donc de mettre <![CDATA[votre_string]]> dans le fichier XML.

ex: mon fichier XML est encodé en iso-8859-1, et pour chaque accent, xml_parser coupait le mot en 2.
Don en transformant la chaîne:

<balise>String accentuée</balise>
par:
<balise><![CDATA[String accentuée]]></balise>
l'erreur n'est plus!


Si le fichier XML est généré automatiquement, il est donc possible de rajouter '<![CDATA[' et ']]>' autour de chaque valeur.
Le résultat n'est pas forcément très beau, mais qu'est-ce que vous voulez, l'affichage est fonctionnel!


P.S: Si vous voyez des sources d'erreurs possibles avec cette solution, ou en avez une autre, je serais curieux d'en entendre parler!

Bonne programmation!
    - Tibo -

Répondre à Bussy14

6

la_lutine, le 3 jun 2008 à 15:22:14
  • +2

Bonjour !
Peut-être que je répond à côté de la plaque, mais moi je fais un utf8_decode() sur les valeurs que je récupère de mon xml. Et mon XML est en <?xml version="1.0" encoding="ISO-8859-1"?>.

La Lutine

Répondre à la_lutine

7

Bussy14, le 3 jun 2008 à 15:29:40

Non ce n'est pas à côté de la plaque, c'est nécessaire aussi.
Pour être capable de lire les accents dans le fichier XML il a besoin de faire un <![CDATA[...]]>, mais une fois les accents lus, pour les afficher comme faut, il faut utiliser utf8_decode() malgrès le fait qu'on soit en ISO-8859-1

    - Tibo -

Répondre à Bussy14

8

YES!!!, le 4 sep 2008 à 13:44:07

Lutine!

MERCI MILLE FOIS!

En effet tu avais raison pour le utf8_decode() et contrairement à bussy 14 message precedent je n'utilise pas du tout !CDATA dans mon XML!! :D ;, apres 1000 et 1 recherches : j'utilise donc dans ma fonction de traitement des caracteres intra balises :

function char($parser,$data) {

global $balise_ouv;
global $n;
global $tab;
$tab[$n][$balise_ouv].=utf8_decode($data);
// echo $data . " ";
}

en header de mon parser.php je mets : header('Content-Type: text/xml; charset=ISO-8859-1');

en tete de mon fichier xml je fous : <?xml version="1.0" encoding="iso-8859-1"?>


Et envoie la sauce mon coco!! ID ID ID

Ouf!! :D

Répondre à YES!!!

9

 Macadoshis, le 6 mar 2009 à 00:52:35
  • +3

Pour ma part, il m'a fallu juste modifier la fonction de xml_parser suivante, de la manière suivante :

// Fonction associée à l'événement données textuelles
function characterData($parser, $data)
{
global $globaldata;
if ($globaldata != "")
{
$globaldata = $globaldata . $data;
}
else
{
$globaldata = $data;
}
// echo "<font color=red>".$data."</font><br>";
}

et à la fin de votre fonction associée à l'événement fin d'élément
function endElement($parser, $name)
il faut finir par l'instruction $globaldata = "";

à savoir :

function endElement($parser, $name)
{
...
$globaldata = "";
}

et voilà !

lors du traitement des noeuds :

<N1> contenu quelconque </N1>
<N2> contenu é avec à â accent(s) </N2>

la lecture de N2 n'affichera plus seulement "â accent(s)", mais la concaténation de "contenu "+"é avec "+"à "+â accent(s)"

hope it'll help you ='D

Répondre à Macadoshis
Collection CommentÇaMarche.net