2010-10-26 59 views
16

Tengo un archivo php que imprime un xml basado en un MySql db.Error XML en ampersand (&)

Me sale un error cada vez exactamente en el punto donde hay un & signo.

Aquí es un poco de 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 salida es lo que quiero, es decir, el archivo de salida a la categoría correcta, pero aún así da un error.

El error dice: xmlParseEntityRef: ningún nombre

Y entonces se apunta al carácter exacto que es un signo &.

Esta queja sólo si el $dbrow['category'] es algo con un & signo en él, por ejemplo: "& coches camiones", o "ordenadores & teléfonos".

¿Alguien sabe cuál es el problema?

BTW: Tengo la codificación establecida en UTF-8 en todos los documentos, así como la salida xml.

Respuesta

33

& en XML inicia una entidad. Como no ha definido una entidad &WhateverIsAfterThat, se produce un error. Debería escapar con &amp;.

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

How do I escape ampersands in XML

para escapar de los otros caracteres reservados:

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

(adición, pero para el cartel) Así use & para escapar correctamente, aunque en lugar de la interpolación de cadenas (muda) debe usar algo que * entienda * XML (por ejemplo, ¿qué sucede cuando la entrada contiene "<"? –

+11

O, m mineral compacto, 'htmlspecialchars ($ string, ENT_QUOTES);' – Wrikken

+1

envolviendo matthy

Cuestiones relacionadas