2008-09-30 8 views
42

Tengo un script php. La mayoría de las veces, el script devuelve html, que funciona bien, pero en una ocasión (parámetro? Format = XML) el script devuelve XML en lugar de HTML.cambiar el tipo de salida de mime en php

¿Hay alguna manera de cambiar el tipo de mime devuelto de la salida de php sobre la marcha de text/html a text/xml o application/xml?

+0

¿Puede proporcionar más información sobre lo que está tratando de hacer? es decir, RSS, xhtml, etc. También encontré este error: http://support.microsoft.com/kb/264868/ – joelhardi

+0

Asegúrese de estar utilizando la llamada de encabezado antes de que salga el texto –

+0

Whoah, mi error, funciona en IE - mi código de generación XML tenía un gran error grande (lo copié de un tutorial, y realmente no leí la línea de salida, que convirtió el XML en HTML usando htmlentities. Lo siento! – Sam

Respuesta

97
header('Content-type: application/xml'); 

Más información disponible en la documentación de PHP para header()

+0

Me sucedió que a la API de Microsoft Visual Studio que genera el servicio web cliente no le gusta la "aplicación/xml", sino que requiere "texto/xml". – GTodorov

13

establecer la cabecera Content-Type:

header('Content-Type: text/xml'); 

Aunque probablemente debería usar "application/xml" en su lugar.

+1

Me entendiste, ¿cuál es la diferencia entre text/xml y application/xml? – Sam

+0

Interacciones entre tipos de contenido de texto/* HTTP con respecto a la codificación, principalmente: vea http://annevankesteren.nl/2005/03/text-xml –

+5

Los proxies de caché pueden editar 'text/*' para cambiar la codificación de caracteres. Dado que XML también declara su codificación de caracteres dentro del documento en sí, realmente no quiere que eso suceda, ya que puede haber una discrepancia. Por lo tanto, use 'application/xml' en su lugar, y los proxies de caché verán el contenido como datos binarios y no lo perturbarán. – TRiG

3

Debe enviar un encabezado Content-Typeantes de que envíe cualquier salida.

header('Content-Type: text/xml'); 
3

Voy a responder a la actualización, ya que las respuestas anteriores son buenas.
He leído que Internet Explorer es muy conocido por ignorar los encabezados de tipo Mime (¿la mayoría de las veces?) Para confiar en el contenido del archivo (lo que puede causar problemas en algunos casos).

Mmm, me hizo una prueba sencilla:

<?php 
header('Content-Type: text/xml'); 
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<root><foo a="b">Tada</foo></root>'; 
?> 

Internet Explorer 6 muestra correctamente como XML. Incluso si elimino la declaración xml.
Debe indicar qué versión es problemática.

En realidad, como escribí anteriormente, con IE (6 como mínimo), ni siquiera necesita un tipo de contenido, reconoce los datos XML y los muestra como un árbol. ¿Tu XML es correcto?

[Actualización] Probado también con IE7, agregando? Format = xml también, aún mostrando XML correctamente. Si envío XML mal formado, IE muestra un error. Probado en WinXP Pro SP2 +

+0

Lo siento, mi error, el código de ejemplo que copié envió el XML a través de htmlentities para el resultado, ¡y no me di cuenta hasta ahora! – Sam

+0

¡Ah! DE ACUERDO. :-) Todos aprendemos de los errores (incluso los de otras personas). – PhiLho

+0

Creo que es texto/xhtml que IE 6 tiene un problema; Nunca he jugado con eso, pero he escuchado muchas quejas al respecto. Creo que IE 6 simplemente no funcionará si envía texto/xhtml, pero no estoy seguro. – dirtside

0

Acabo de utilizar lo siguiente:
NOTA: Estoy usando "i" para una extensión mejorada de sql.

Start XML file, echo parent node 
header("Content-type: text/xml"); 
echo "<?xml version='1.0' encoding='UTF-8'?>"; 
echo "<marker>"; 

iterar por las filas, los nodos de la impresión XML para cada

while ($row = @mysqli_fetch_assoc($results)){ 
    // Add to XML document node 
    echo '<marker '; 
    echo 'id="' . $ind . '" '; 
    echo 'name="' . parseToXML($row['name']) . '" '; 
    echo 'address="' . parseToXML($row['address']) . '" '; 
    echo 'lat="' . $row['lat'] . '" '; 
    echo 'lng="' . $row['lng'] . '" '; 
    echo 'type="' . $row['type'] . '" '; 
    echo '/>'; 
} 

// End XML file 
echo "</marker>"; 
0
header('Content-Type: application/xml; charset=utf-8'); 

Puede agregar codificación, así como en la misma línea. Agregué utf-8, que es más común.