2010-08-12 5 views
1

J'ai quelques cordes qui sont valides dans ma base de données, mais quand je les ai inclus dans un attribut d'une sortie XML UTF-8 ils me donnent l'erreur suivante:Mise en forme chaîne pour l'attribut xml en php

XML Parsing Error: not well-formed

Mon code actuel (simplifié):

header('Content-Type: text/xml'); 
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'; 
echo '<root attribute="' . htmlentities($string_from_hell) . '">'; 

Comment dois-je formater ces chaînes avant de les inclure dans les attributs XML?

Une valeur possible pour $string_from_hell:  (ne sait pas si elle affichera correctement)

+0

Je n'utiliserais pas un mot "assainir" ici. "Formatage" me semble plus approprié. –

+0

@Col. Shrapnel Vous avez raison. Édité. – hpique

Répondre

6

Essayez

htmlspecialchars($string_from_hell, ENT_QUOTES, "UTF-8") 

htmlentities ne fera pas parce qu'il va créer des entités HTML qui ne sont pas reconnus en XML, seulement HTML. Vous devez également spécifier le charset car la valeur par défaut n'est pas UTF-8, c'est l'ISO-8859-1.

Il vous manque aussi les guillemets (") autour de la valeur de l'attribut.

Il existe également de meilleurs moyens de créer des fichiers XML qui traitent l'échappement pour vous. Voir par exemple XMLWriter.

+0

Je pense que la vraie réponse devrait être d'utiliser les API DOM appropriées pour construire le XML au lieu de la concaténation de chaînes. En outre, le code de l'OP manque les guillemets autour de la valeur de l'attribut autant que je peux dire. – Joey

+0

@Johan Vous avez raison, j'ai manqué les citations. En ce qui concerne l'API DOM, je pense que c'est inutilement compliqué (et inefficace) pour la construction de XML à moins que vous ayez besoin de l'arbre DOM complet par la suite. – Artefacto

+0

Aucune idée de l'apparence de ces API en PHP. Mais quelque chose de similaire à SAX peut suffire (ce que semble XMLWriter). Je ne fais pas grand-chose en XML alors pardonnez l'inexactitude :-) – Joey