2010-10-26 4 views
16

J'ai un fichier php qui imprime un xml basé sur un db MySQL.Erreur XML à l'esperluette (&)

Je reçois une erreur à chaque fois exactement au point où il y a un signe &.

Voici quelques-uns php:

$query = mysql_query($sql); 

$_xmlrows = ''; 

while ($row = mysql_fetch_array($query)) { 
    $_xmlrows .= xmlrowtemplate($row); 
} 

    function xmlrowtemplate($dbrow){ 
    return "<AD> 
      <CATEGORY>".$dbrow['category']."</CATEGORY> 
      </AD> 
    } 

La sortie est ce que je veux, à savoir le fichier génère la bonne catégorie, mais donne toujours une erreur.

L'erreur dit: xmlParseEntityRef: pas de nom

Et il souligne le caractère exact qui est un signe &.

Ce ne se plaint que si le $dbrow['category'] est quelque chose avec un & signe dans, par exemple: « voitures & camions », ou « ordinateurs & téléphones ».

Quelqu'un sait-il quel est le problème? BTW: J'ai l'encodage défini sur UTF-8 dans tous les documents, ainsi que la sortie xml.

Répondre

33

& en XML démarre une entité. Comme vous n'avez pas défini une entité &WhateverIsAfterThat, une erreur est générée. Vous devriez y échapper avec &amp;.

$string = str_replace('&', '&amp;', $string); 

How do I escape ampersands in XML

Pour échapper aux autres personnages réservés:

function xmlEscape($string) { 
    return str_replace(array('&', '<', '>', '\'', '"'), array('&amp;', '&lt;', '&gt;', '&apos;', '&quot;'), $string); 
} 
+0

(addition, mais pour l'affiche) Donc, utilisez & pour lui échapper correctement - bien qu'au lieu de l'interpolation de chaîne (muette), vous devriez utiliser quelque chose qui * comprend * XML (par exemple, que se passe-t-il lorsque l'entrée contient "<"? –

+11

Ou, m minerai compact, 'htmlspecialchars ($ string, ENT_QUOTES);' – Wrikken

+1

envelopper dans matthy