[DOM XML] Comment encoder les caracteres accentues du contenu d'un node

Le
Jean-Marc Molina
Bonjour,

Je cherche à générer un fil RSS à l'aide des fonctions DOM XML de PHP. J'ai
une erreur lorsque le contenu de l'élément title contient un caractère
accentué, ce qui est le cas vu que je souhaite nommer mon fil "Mon site -
Actualité", logique :).

<?php

header ('content-type: text/xml');

echo ('<?xml version="1.0" encoding="ISO-8859-15"?>');

$dom_doc = domxml_new_doc ('1.0');

$rss_el = $dom_doc->create_element ('rss');
$rss_el->set_attribute ('version', '2.0');
$rss_el = $dom_doc->append_child ($rss_el);

$channel_el = $dom_doc->create_element ('channel');
$channel_el = $rss_el->append_child ($channel_el);

$title_el = $dom_doc->create_element ('title');
$title_el = $channel_el->append_child ($title_el);
$title_el->set_content ('Mon site - Actualité');

echo ($dom_doc->html_dump_mem ());

?>

Si vous renommez Actualité en Actualite, ça fonctionne. J'ai aussi essayé
d'encoder la chaîne avec la fonction htmlentities mais rien n'y fait.

Le message d'erreur :
Error I get :
XML Parsing Error: not well-formed
Location: news.php?action=syndicate&format=rss2
Line Number 1, Column 102:<?xml version="1.0" encoding="ISO-8859-15"?><rss
version="2.0"><channel><title>Mon site - Actualit
-
-^

Le parsing the fichier XML généré s'arrête sur le caractère accentué é de
Actualité.

--
Jean-Marc.
  • Partager ce contenu :
Vos réponses
Trier par : date / pertinence
Jean-Marc Molina
Le #668975
Jean-Marc Molina a écrit/wrote :
$title_el->set_content ('Mon site - Actualité');


Il faut utiliser la fonction mb_convert_encoding pour encoder la chaîne au
format UTF-8.
On peut aussi appeler 2 fois la fonction htmlentities afin de transformer
tous les caractères en entités compatibles XML, le jeu est beaucoup plus
réduit que celui de HTML.

--
Jean-Marc.

Ganf
Le #669169
Le Tue, 21 Sep 2004 15:46:34 +0000, Jean-Marc Molina a écrit :
echo ('

Pourquoi commences tu à envoyer un prologue XML ? si le doc est un doc
XML, les fonctions DOM te retourneront toutes seules ce prologue, pas
besoin de le rajouter.

echo ($dom_doc->html_dump_mem ());


Pourquoi fais tu une sortie en mode html ? si tu fais du RSS et si tu met
un prologue, c'est que ce que tu envoies est du XML, pas du SGML/HTML. Tu
n'es là pas cohérent. Utilises donc un dump_mem() tout bête.



De plus dans ce prologue tu déclares que ton contenu est en ISO-8859-15.
Or étrangement tu n'informes pas DOM par la suite que tu aimerais que sa
sortie soit effectivement en ISO-8859-15. Il ne respecteras donc pas
forcément ton choix (puisque tu ne n'en l'as pas informé). Manque de
chance, par défaut DOM sort de l'UTF-8. Donc tu viens de déclarer que
ton DOC est en ISO-8859-15 alors qu'il est en UTF-8. Tout ton problème
vient de là.

Ne met pas ton prologue et laisse DOM mettre le sien (il ne le fera pas
forcément mais s'il ne le fait pas c'est qu'il utilise les défauts XML
et il ne faut pas le contredire avec un prologue contraire).
De même fais ta sortie en XML (et du coup il devrait effectivement mettre
un prologue), tu éviteras les erreurs de syntaxe.

--
Eric Daspet

Poster une réponse
Anonyme